【发布时间】:2013-07-08 02:28:21
【问题描述】:
我以前从未使用过多处理模块。
有没有办法可以将 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()
【问题讨论】:
-
"我的意思是当我已经 q.put 时?"确切地!你的例子太琐碎了。即使没有
q.put()循环,也不足以证明在进程之间划分它是合理的。 -
@BrianCain 我知道。它很愚蠢。但我可以使用线程来理解它们是如何工作的。我想知道进程是如何工作的。特别是我的问题是使循环并行。
标签: python python-2.7 python-multithreading