python - billiard.pool 地图功能挂起
问题描述
我需要使用所有可用的 CPU 并行运行我的逻辑,因为我使用台球包进行池化,PFB 我的技术堆栈 -
-Python 3
-Django==2.0.5
-Django rest from work
-celery==4.2.0
我的问题是,当我点击我的 rest-API 并触发我的 celery 任务时,它会执行直到池线,但在那之后,它挂起,我没有收到任何错误消息,但它没有进一步移动。
PFB我的项目结构:
-cdm
|cmdapp
| |
| |helper
| | |aaa.py
| |tasks
| | |bbb.py
| |api
| |ccc.py
|cdm
| |settings.py
|manage.py
PFB 我的代码示例:
#cmdapp.helper.aaa.py
from billiard.pool import Pool
class A():
def squre(self,number):
return number*number
def calculate(self,number_list):
pool = Pool()
result = pool.map(self.squre, number_list)
return result
#cmdapp.tasks.bbb.py
from celery import task
from cmdapp.helper.aaa import A
@task
def calculation_task(number_list):
a_obj=A()
result=a_obj.calculate(number_list)
#cmdapp.api.ccc.py
from rest_framework.views import APIView
from rest_framework import status, permissions
from rest_framework.response import Response
from cmdapp.tasks.bbb import calculation_task
class C(APIView):
def get(self, request):
range_list=range(1000)
calculation_task.delay(range_list)
return Response({
"result": "success",
}, status=status.HTTP_200_OK)
我浏览了一些文章,他们提到不可选择的函数不能被 pool.map 函数调用。在这里,我没有得到我的功能是可选择的还是不可选择的,以及为什么它会挂起。请帮忙。
解决方案
我也遇到了同样的问题,我通过将对象方法转换为类方法或静态方法解决了这个问题
我认为这种方式可以解决这个问题。
class A():
@classmethod
def squre(cls,number):
return number*number
def calculate(self,number_list):
pool = Pool()
result = pool.map(squre, number_list)
return result
推荐阅读
- ios - 如何从通知中心删除 MPRemoteCommandCenter
- java - 使用 Jackson 为不同请求对单个实体的不同属性进行 JSON 序列化
- python - NameError:名称“用户名”未在我的表单中定义
- react-native - 无法使用 'Content-Type': 'multipart/form-data' 获得 .post 来工作 Axios React Native
- arrays - 数组中每个“_id”的别名
- grails - grails 升级到 3.3.10 bootrun 上的 TaskExecutionException
- c# - Database.Migrate() 引发 SQL Server Express 登录失败错误
- ruby - 我检查什么条件以引发自定义错误 Net::OpenTimeout 执行过期错误
- reactjs - 在 nextjs 中有一个通用的标题布局
- python - 未定义全局名称“NAME”