问题遇到的现象和发生背景
Django 视图函数代码
def myFunc(i, l):
l.append(i)
@api_view(['GET'])
def test_11(request):
manager = Manager()
temp_list = manager.list()
for i in range(5):
p = Process(target=myFunc, args=[i, temp_list])
p.start()
p.join()
logger.error("temp_list: {}".format(temp_list))
return CommonRespone(msg="ok")
报错信息:
2022-08-07 11:34:03,906|WARNING|basehttp.py|basehttp|"GET /test_11/ HTTP/1.1" 400 75091
Traceback (most recent call last):
File "/root/yangt/test2/lib/python3.9/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/root/yangt/test2/lib/python3.9/site-packages/rest_framework/decorators.py", line 50, in handler
return func(*args, **kwargs)
File "/data/opt/cmdb-yangt/cmdb/apps/server_maintain/views/version.py", line 911, in test_11
temp_list = manager.list()
File "/data/opt/python3.9.5/lib/python3.9/multiprocessing/managers.py", line 714, in temp
token, exp = self._create(typeid, *args, **kwds)
File "/data/opt/python3.9.5/lib/python3.9/multiprocessing/managers.py", line 597, in _create
conn = self._Client(self._address, authkey=self._authkey)
File "/data/opt/python3.9.5/lib/python3.9/multiprocessing/connection.py", line 513, in Client
answer_challenge(c, authkey)
File "/data/opt/python3.9.5/lib/python3.9/multiprocessing/connection.py", line 757, in answer_challenge
message = connection.recv_bytes(256) # reject large message
File "/data/opt/python3.9.5/lib/python3.9/multiprocessing/connection.py", line 221, in recv_bytes
buf = self._recv_bytes(maxlength)
File "/data/opt/python3.9.5/lib/python3.9/multiprocessing/connection.py", line 419, in _recv_bytes
buf = self._recv(4)
File "/data/opt/python3.9.5/lib/python3.9/multiprocessing/connection.py", line 384, in _recv
chunk = read(handle, remaining)
BlockingIOError: [Errno 11] Resource temporarily unavailable
我的解答思路和尝试过的方法
尝试了使用 Flask 实现类似逻辑,可以正常运行:
Flask 代码:
from flask import Flask
from multiprocessing import Process, Manager
app = Flask(__name__)
def myFunc(i, l):
l.append(i)
@app.route('/')
def hello_world():
manager = Manager()
temp_list = manager.list()
for i in range(5):
p = Process(target=myFunc, args=[i, temp_list])
p.start()
p.join()
print(temp_list)
return 'hello world'
if __name__ == "__main__":
app.run()
请求结果:
(flask) [root@dashboard01 tmp]# python hello.py
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Serving Flask app 'hello'
* Debug mode: off
* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
[0, 2, 1, 4, 3]
127.0.0.1 - - [07/Aug/2022 11:47:21] "GET / HTTP/1.1" 200 -
我想知道是因为 Django 本身的原因导致无法使用 multiprocessing.Manager 模块定义共享变量,还是我的使用方式有问题?