我之前从未使用过多处理模块。
是否可以将for循环转换为并发子进程。喜欢
for i in xrange(10): list.append(i)
而不是顺序,让它平行?
我尝试使用队列模块
q = Queue.Queue()
for i in xrange(10):
q.put(i)
def addto(q):
new.append(q.get(block=False))
processes = [Process(target=addto, args=(q,))]
for p in processes:
p.start()
for p in processes:
p.join()
它给出了一个很长的错误,我粘贴了它的最后一个:
C:\WinPython-64bit-2.7.3.3\python-2.7.3.amd64\lib\pickle.pyc in save_global(self, obj, name, pack)
746 raise PicklingError(
747 "Can't pickle %r: it's not found as %s.%s" %
--> 748 (obj, module, name))
749 else:
750 if klass is not obj:
PicklingError: Can't pickle <type 'thread.lock'>: it's not found as thread.lock
我也看到了很多:
processes = [Process(target=func, args=(q,x)) for i in some iterable]
好吧有一个func(q,x)好吧,我有一个map()或for循环/同时进入我的函数func(),那么为什么迭代进程再次? 我不想使用进程循环整个函数,只是将这些特定的循环转换为并行进程。为什么用args迭代目标函数?我的意思是,当我已经q.put它?
如果我做了
processes = Process(target=addto, args=(q,)).start()
答案 0 :(得分:4)
Queue.Queue
用于线程安全队列,并且线程基元不能传输到其他进程。你想要multiprocessing.Queue
;简单地替换
import Queue
q = Queue.Queue()
与
import multiprocessing
q = multiprocessing.Queue()
此外,new
必须是multiprocessing.managers.list
类型。
但请注意,您只是在复制multiprocessing.Pool
;你可以写
import multiprocessing
new = multiprocessing.Manager().list()
def addto(val):
new.append(val)
pool = multiprocessing.Pool()
for i in xrange(10):
pool.apply_async(addto, (i,))
pool.close()
pool.join()
print(new)