当使用Pool.apply_async运行大量任务(具有大参数)时,将分配进程并进入等待状态,并且对等待进程的数量没有限制.这可能最终会占用所有内存,如下例所示:
import multiprocessing
import numpy as np
def f(a,b):
return np.linalg.solve(a,b)
def test():
p = multiprocessing.Pool()
for _ in range(1000):
p.apply_async(f, (np.random.rand(1000,1000),np.random.rand(1000)))
p.close()
p.join()
if __name__ == '__main__':
test()
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种限制等待队列的方法,以便只有有限数量的等待进程,并且在等待队列已满时阻塞Pool.apply_async.
尝试从其他包中 cimport pxd 定义。
简单的例子,一个.pxd文件:
cdef inline void a():
print "a"
Run Code Online (Sandbox Code Playgroud)
b.pyx 文件:
cimport a
def b():
a.a()
Run Code Online (Sandbox Code Playgroud)
到这里为止,一切正常,并且$ cython b.pyx
可以正常工作。
如果我将 a.pxd 移动到一个文件夹,例如libs/
,那么我将 b.pyx 更改为:
from libs cimport a
def b():
a.a()
Run Code Online (Sandbox Code Playgroud)
然后我有错误:
$ cython b.pyx
Error compiling Cython file:
------------------------------------------------------------
...
from libs cimport a
^
------------------------------------------------------------
b.pyx:1:0: 'a.pxd' not found
Error compiling Cython file:
------------------------------------------------------------
...
from libs cimport a
^
------------------------------------------------------------
b.pyx:1:0: 'libs/a.pxd' not found
Run Code Online (Sandbox Code Playgroud)
但是 libs/a.pxd 就在那里。从其他包导入 pxd 定义的正确方法是什么?