YangCQU 2022-08-07 12:54 采纳率: 0%
浏览 64
已结题

Django视图函数中使用多进程+multiprocessing.Manager模块使用共享变量报错

问题遇到的现象和发生背景

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 模块定义共享变量,还是我的使用方式有问题?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 8月15日
    • 创建了问题 8月7日

    悬赏问题

    • ¥15 java,maven
    • ¥15 单独编译安卓13车载evs
    • ¥20 完成实验一,要求按照图片要求,实验报告一定要按照要求,并且回答简答题,截止日期明天中午12:00
    • ¥30 孪生网络模型,当训练集与测试集共用一个数据集时,训练准确率为100%,而测试准确率仍在50%左右浮动(正常来说测试的都是学习过的数据,准确率应为100%)。【不要GPT及任何大模型回答】
    • ¥15 关于#pynetdicom#的问题,如何解决?(标签-python|关键词 c_get、pydicom、pynetdicom)
    • ¥15 怎么在c语言上输出对应数据类型的内存大小以及数值范围
    • ¥30 河流的geojson数据为什么放到mapshaper网站中全部是长方形
    • ¥20 ANSYS fluent烟雾扩散仿真
    • ¥15 新建vitis工程时,显示创建失败,需要查看vitis log
    • ¥15 java 在同一包下无法跨文件引入自己写的类,也无法导包过去