Python多处理。队列单个项目的最大大小

Python多处理。队列单个项目的最大大小,python,multiprocessing,queue,Python,Multiprocessing,Queue,我将一个任务卸载到一个单独的进程,以保护我的内存空间。该进程运行一个cythonized C库,该库在运行之后往往无法完全清理。然后通过多处理.Queue返回结果。但是,一旦要返回的项目达到一定大小,Queue.get方法就会暂停 我使用的是processify包装器,它将函数调用包装在进程中 我的测试功能是 @processify def do_something(大小:int): 返回np.zero(shape=size,dtype=np.uint8) 我的测试代码是 如果uuuu nam

我将一个任务卸载到一个单独的进程,以保护我的内存空间。该进程运行一个cythonized C库,该库在运行之后往往无法完全清理。然后通过
多处理.Queue
返回结果。但是,一旦要返回的项目达到一定大小,
Queue.get
方法就会暂停

我使用的是
processify
包装器,它将函数调用包装在
进程中

我的测试功能是

@processify
def do_something(大小:int):
返回np.zero(shape=size,dtype=np.uint8)
我的测试代码是

如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
对于范围(1,11)内的k:
打印(f“{k*256}MB”)
t0=时间()
做点什么(k*256*1024*1024)
打印(f“take{time()-t0:0.1f}s”)
这将平稳运行到2048MB,在此期间它只停留几分钟(无CPU活动),直到我取消该进程:

256MB
Took 0.7s
512MB
Took 1.6s
768MB
Took 2.1s
1024MB
Took 2.7s
1280MB
Took 3.4s
1536MB
Took 4.0s
1792MB
Took 4.6s
2048MB
^CTraceback (most recent call last):
  File "processify.py", line 63, in <module>
    do_something(k * 256 * 1024 * 1024)
  File "processify.py", line 40, in wrapper
    ret, error = q.get()
  File "/home/.../python3.7/multiprocessing/queues.py", line 94, in get
    res = self._recv_bytes()
  File "/home/.../python3.7/multiprocessing/connection.py", line 216, in recv_bytes
    buf = self._recv_bytes(maxlength)
  File "/home/.../python3.7/multiprocessing/connection.py", line 407, in _recv_bytes
    buf = self._recv(4)
  File "/home/.../python3.7/multiprocessing/connection.py", line 379, in _recv
    chunk = read(handle, remaining)
KeyboardInterrupt
256MB
用了0.7秒
512MB
花了1.6秒
768MB
花了2.1秒
1024MB
花了2.7秒
1280MB
花了3.4秒
1536MB
花了4.0秒
1792MB
花了4.6秒
2048MB
^CTraceback(最近一次通话最后一次):
文件“processify.py”,第63行,在
做点什么(k*256*1024*1024)
包装器中第40行的文件“processify.py”
ret,error=q.get()
get中的文件“/home/../python3.7/multiprocessing/queues.py”,第94行
res=self.\u recv\u bytes()
文件“/home/../python3.7/multiprocessing/connection.py”,第216行,以recv_字节为单位
buf=自身接收字节(最大长度)
文件“/home/../python3.7/multiprocessing/connection.py”,第407行,以字节为单位
buf=自我记录(4)
文件“/home/../python3.7/multiprocessing/connection.py”,第379行,在
区块=读取(句柄,剩余)
键盘中断
从堆栈跟踪可以明显看出,
Queue.get
函数正在等待。如果我添加
print
语句,我可以看到
Queue.put
此时已经完成,因此返回值应该在队列中。我还尝试在没有
进程的情况下运行。按照GitHub gist中推荐的方法加入
,但这也没有帮助

我知道这种设计是次优的,我可能应该修复cython库,这样我就不需要首先卸载。然而,我想知道python的多处理是否存在固有的限制,即不允许特定大小的对象通过队列

提前谢谢大家