When I am using multiprocessing
module to establish a socket connection between a flask server and a client, the flask server fails to load the pages (routes).
Here is a minimal reproducible code:
Client.py
from multiprocessing.connection import Listener
port_number = 9000
listener = Listener(('localhost', port_number), authkey=b'secret password') ------------------
conn = listener.accept() ------------------
print("connection accepted form flask server") ------------------
while True:
msg = conn.recv()
print(msg)
Server.py
from multiprocessing.connection import Client
from flask import Flask
port_number = 9000
conn = Client(('localhost', port_number), authkey=b'secret password')
print("connection established with client")
conn.send("first message")
app = Flask(__name__)
@app.route("/")
def welcome():
return "hello world"
if __name__ == '__main__':
app.run(debug=True)
In the above codes, if client.py
is run and then server.py
is run, then the flask app's home page does not return "hello world".
But when the 3 marked lines are commented in the client.py
file, i.e., when the sockets are not used for connection, then the above-mentioned issue does not occur.
In the above-mentioned codes, if the socket connection from the server.py
is made with any other files, then also the flask app does not work.
What could be the reason for this?? I am unable to find some obvious logical reason for this.
Just move conn.send("first message")
to another thread and change port for Flask app, your code above blocks Flask server from running.
your server:
from multiprocessing.connection import Client
from flask import Flask
from threading import Thread
import time
FLASK_PORT = 9000
PR_PORT = 8000
def thread_target_func():
"""send all this actions to another thread"""
conn = Client(('localhost', PR_PORT), authkey=b'secret password')
print("connection established with client")
try:
# let's add while loop to male client to be busy with smth
# otherwise you'll get error in client soon - EOF
while True:
conn.send("first message")
time.sleep(5)
except Exception as ex:
print(ex)
app = Flask(__name__)
@app.route("/")
def welcome():
return "hello world"
if __name__ == '__main__':
# start you connection in another Thread
th = Thread(target=thread_target_func)
th.start()
# run Flask app in main thread
app.run(host="0.0.0.0", port=FLASK_PORT)
th.join()
your client:
from multiprocessing.connection import Listener
PORT = 8000
if __name__ == '__main__':
listener = Listener(('localhost', PORT), authkey=b'secret password')
conn = listener.accept()
print("connection accepted form flask server")
while True:
msg = conn.recv()
print(msg)