【发布时间】:2015-02-11 20:14:58
【问题描述】:
我不确定我想要做的是否是一种有效的做法,但它是这样的: 我需要我的程序高度并行化,所以我认为我可以创建 2-3 个进程,每个进程可以有 2-3 个线程。
1) 这可能吗? 2)这有什么意义吗? 3) 这是我的代码,但是当我尝试加入进程时它挂起。
PQ = multiprocessing.Queue()
[...]
def node(self, files, PQ):
l1, l2 = self.splitList(files)
p1 = multiprocessing.Process(target=self.filePro, args=(l1,PQ,))
p2 = multiprocessing.Process(target=self.filePro, args=(l2,PQ,))
p1.daemon = True
p2.daemon = True
p1.start()
p2.start()
p1.join() # HANGS HERE
p2.join()
while 1:
if PQ.empty():
break
else:
print(PQ.get())
PQ.join()
def filePro(self,lst,PQ):
TQ = queue.Queue()
l1, l2 = self.splitList(lst)
t1 = threading.Thread(target=self.fileThr, args=('a',l1,TQ,))
t2 = threading.Thread(target=self.fileThr, args=('b',l2,TQ,))
t1.daemon = True
t2.daemon = True
t1.start()
t2.start()
t1.join()
t2.join()
while 1:
if TQ.empty():
break
else:
PQ.put(TQ.get())
TQ.task_done()
TQ.join()
def fileThr(self,id,lst,TQ):
while lst:
tmp_path = lst.pop()
if (not tmp_path[1]):
continue
for item in tmp_path[1]:
TQ.put(1)
TQ.join()
【问题讨论】:
-
当我需要最大化 cpu 使用率时我使用进程,当我有磁盘访问、网络等阻塞操作时我使用线程。所以如果我有一个脚本来下载许多文件,我会创建一个池线程并使用它。如果我有一个 CPU 峰值的分布式计算,我会使用一个进程池。
-
如果您希望我们调试您的代码,我们需要minimal, complete, verifiable example。
标签: python multithreading multiprocessing