Search code examples
pythonflaskpython-multithreading

Passing argument in thread without invoking - how to put Flask server in thread


How I can start flask server in a thread with custom ip (listening the network)?

This line doesn't block the main thread, but it doesn't listen connections from the network.

threading.Thread(target = app.run).start()

When this is used it waits to this thread to finish, and main thread is blocked.

#threading.Thread(target = app.run(host='192.168.1.42')).start()

I have tried to make game, Pygame is running in mainthread and flask server is used to host webpage, which offer joystick for players.

At the moment i can control it with local machine, but not via mobilephone. And if i config the flask with custom ip, the main thread will stop for to wait the server thread.

It's something to do with invoking and referring, but i don't know how to setup the thread with argument, but without invoking.

Whole pycharm project is in GitHUB

Here is the server.py

from flask import Flask,render_template,request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
import threading


def initServer(controlDataToPyGame):  #argument is queue for transferring data to main thread


    app = Flask(__name__)
    app.debug= False


    @app.route('/')

    def index():
        print("index")
        return render_template('index.html')

    @app.route('/play/')
    def play():
        print("play")
        return render_template('controller.html')

    @app.route("/Control/")
    def UP():
        x = request.args.get('joyX')
        y = request.args.get('joyY')

        controlDict = {"name":"ice", "x":x,"y":y}
        controlDataToPyGame.put(controlDict)

        return ("nothing")


    ##this doesn't block the main thread,  but it doesn't listen connections from the network.
    threading.Thread(target = app.run).start()

    #when this is used it waits to this thread to finish, and main thread is blocked.
    #threading.Thread(target = app.run(host='192.168.1.42')).start()

Solution

  • If you read documentation for Thread then you see args= and kwargs=

    threading.Thread(target=app.run, kwargs={'host': '192.168.1.42'}).start()
    

    Using

    threading.Thread(target = app.run(host='192.168.1.42')).start()
    

    you simply run app.run() before sending its result to Thread like

    result = app.run(host='192.168.1.42')
    Thread(target=result).start()
    

    and it runs app.run() in main thread forever - and it never use Thread