Python多进程/多线程 multiprocessing apply_async报错“left &#62 0” AssertionError

Python multiprocessing apply_async报错“left > 0” AssertionError

我使用的python版本:python3.7.3。

在处理一份较大的数据文件(17G)时,无论使用多进程或多线程均报此错误。在任务管理器里查看内存是完全足够的。查了很久才找到原因。

实现多进程/多线程时调用的类:
进程池:
from multiprocessing import Pool
线程池:
from multiprocessing.pool import ThreadPool

报错如下:

Process SpawnPoolWorker-4:
Traceback (most recent call last):
File"C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 297, in _bootstrap
self.run()
File"C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File"C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 110, in worker
task = get()
File"C:\ProgramData\Anaconda3\lib\multiprocessing\queues.py", line 352, in get
res = self._reader.recv_bytes()
File"C:\ProgramData\Anaconda3\lib\multiprocessing\connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
File"C:\ProgramData\Anaconda3\lib\multiprocessing\connection.py", line 318, in _recv_bytes
return self._get_more_data(ov, maxsize)
File"C:\ProgramData\Anaconda3\lib\multiprocessing\connection.py", line 337, in _get_more_data
assert left > 0
AssertionError

原因:python C的核心代码会阻止大于2GB的数据响应正常返回主线程/进程。

(python3.8中是否对此bug更新存疑)

StackOverflow上的回答:

There is a bug in Python C core code that prevents data responses bigger than 2GB return correctly to the main thread. you need to either split the data into smaller chunks as suggested in the previous answer or not use multiprocessing for this function.(UPDATE: the fix is present in python 3.8.0+)

StackOverflow上的问题描述和回答

我的解决方法

待处理的数据比较大,因为内存限制,能开的进程也不多,就手动运行多个进程了,这样也就不存在子进程的问题了。
有时间可以试试升到python3.8之后问题是否解决。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值