[英]Not Able To MultiProcess Python Flask Server
大家好我正在尝试与女服务员一起创建一个多进程 flask 服务器但是每次我执行它我都会遇到问题并且无法识别它们如果我尝试多线程则执行相同
我正在使用多处理,因为我想完全控制 flask 服务器(运行/终止)
API通讯.py
import ProcessBuilder as pb
import ServiceLogger as sl
import SystemRecovery as sr
from flask import Flask, Response
from waitress import serve
from flask_cors import CORS
class EndpointAction(object):
def __init__(self, action):
self.action = action
self.logger = sl.ServiceLogger()
self.response = Response(status=200, headers={})
def __call__(self, *args):
self.action()
return self.response
class APIServer:
def __init__(self):
self.server = None
self.debug = sr.Recovery().debug
self.port = sr.Recovery().api_port
self.host = '127.0.0.1'
self.logger = sl.ServiceLogger()
self.app = Flask(__name__)
CORS(self.app, resources={r"/api/*": {"origins": "*"}})
self.register_endpoints()
self.server = pb.ProcessBuilder().create_process(self.run, [self])
def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(handler))
def register_endpoints(self):
return None
def start(self):
self.server.start()
def run(self):
serve(self.app, port=self.port, host=self.host)
def terminate(self):
self.server.kill()
return None
a = APIServer()
a.start()
print("heyy")
a.terminate()
print("thread killed")
ProcessBuilder.py
import multiprocessing
import random
import string
import ServiceLogger as sl
class ProcessBuilder:
def __init__(self):
self.processes = []
self.logger = sl.ServiceLogger()
def create_process(self, method, args=[]):
process = multiprocessing.Process(name=self.__generate_instance_name(), target=method, args=tuple(args))
self.processes.append(process)
return process
def get_process_instance(self, process_name):
for process in self.processes:
if str(process.name) == process_name:
return process
return None
def run_process(self, process):
process.start()
def kill_process(self, process):
process.kill()
def __generate_instance_name(self):
# printing lowercase
letters = string.ascii_lowercase
randomString = ''.join(random.choice(letters) for i in range(3))
# printing letters
letters = string.digits
randomDigits = ''.join(random.choice(letters) for i in range(5))
return randomString + "" + randomDigits
Output:
C:\Python\python.exe D:\Projects\APICommunications.py
Service Logger Started...........
Service Logger Started...........
Traceback (most recent call last):
File "D:\Projects\Red\APICommunications.py", line 52, in <module>
a.start()
File "D:\Projects\Red\APICommunications.py", line 41, in start
self.server.start()
File "C:\Python\Lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
^^^^^^^^^^^^^^^^^
File "C:\Python\Lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python\Lib\multiprocessing\context.py", line 336, in _Popen
return Popen(process_obj)
^^^^^^^^^^^^^^^^^^
File "C:\Python\Lib\multiprocessing\popen_spawn_win32.py", line 94, in __init__
reduction.dump(process_obj, to_child)
File "C:\Python\Lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
AttributeError: Can't pickle local object 'Flask.__init__.<locals>.<lambda>'
这不是你怎么做的。 :-)
如果你想让多个进程在给定端口上回答 HTTP 请求,即使我们计算出细节以便那里的任何数据都是可挑选的并且你实际上可以在不同的进程中启动女服务员,你也会遇到明显的墙比一个进程试图监听同一台计算机上的同一个端口——除了第一个进程之外的所有进程都会因操作系统本身的“地址已在使用”错误而终止。
相反,请记住,女服务员不是为生产应用程序服务而设计的,应该只用作开发 http/wsgi 服务器。 最近的版本甚至对并行请求有一些支持,但那是在多线程模式下——即使它支持多处理配置,也应该在女服务员内部完成,而不是在女服务员外部完成。
相反,您应该查看有关如何使用生产级 WSGI 服务器为您的项目提供服务的文档,例如 gunicorn 或 uWSGI 就是很好的例子,并且两者都是广泛可配置的,允许设置多少个工作进程以及在每个进程中有多少工作线程应该响应请求。 所有并行化和多处理支持都不是微不足道的,并且深入到这些项目中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.