我想使用python3并行运行一个进程。我的代码在另一个之后运行一个东西。关于如何使其平行的任何想法?
from multiprocessing import Process
def work(x, outfile):
for i in range(0,200000):
print(x, i,'hello world', outfile)
if __name__ == '__main__':
NUM_THREADS = 4
for x in range(NUM_THREADS):
try:
outfile = "tmp"+str(x)
p = Process(target=work, args =(x, outfile))
p.start()
p.join()
except:
raise
print("Error: unable to start thread", x)
答案 0 :(得分:0)
您无法启动并加入同一循环的同一个块。连接意味着当前运行的线程必须停止,直到“进程”开始完成
if __name__ == '__main__':
NUM_THREADS = 4
process_list = []
for x in range(NUM_THREADS):
try:
outfile = "tmp"+str(x)
p = Process(target=work, args =(x, outfile))
p.start()
process_list.append(p)
except:
raise
print("Error: unable to start thread", x)
# wait for processes to finish
for process in process_list:
process.join()
答案 1 :(得分:0)
我不确定这是否与您相关,但我一直在努力使用多进程模块,而是使用pathos模块取得了更大的成功(至少在Linux和Mac中,而不是Windows)。我已将其设置为多核使用,但请检查pathos模块以进行线程/核心拆分使用。
感谢Mike McKerns编写这个软件包,它使我的生活更容易在python中使用多核
需要最少的代码,见下文:
from pathos.helpers import mp
import numpy as np
x=np.arange(0,200000)
splitx=np.array_split(x,4)
def dummy(y):
return(y)
pooler=mp.Pool(4)
for value in pooler.imap(dummy,splitx):
print(value)
pooler.close()
pooler.join()
[ 0 1 2 ..., 49997 49998 49999]
[50000 50001 50002 ..., 99997 99998 99999]
[100000 100001 100002 ..., 149997 149998 149999]
[150000 150001 150002 ..., 199997 199998 199999]
答案 2 :(得分:0)
首先,sincs multiprocessing.Process 将在一个新的 python inperteter 中运行它的目标函数,内置的打印不会打印到控制台来解决这个问题,只是导入
import jpe_types.paralel
它将覆盖打印语句
但是,您必须使用 jpe_types.paralel.Process 而不是 multiprocessing.Process 来覆盖 Process 解释器中的打印
除此之外,您必须启动所有进程,然后再加入它们,因此将它们保存到这样的列表中
import jpe_types.paralel
def work(x, outfile):
for i in range(0,5):
print(x, i,'hello world', outfile)
if __name__ == '__main__':
NUM_PROCESSES = 4
processes = []
for x in range(NUM_PROCESSES):
outfile = "tmp"+str(x)
p = jpe_types.paralel.Process(target=work, args =(x, outfile))
p.start()
processes.append(p)
for p in processes:
p.join()
这比输出
1 0 hello world tmp1
2 0 hello world tmp2
0 0 hello world tmp0
3 0 hello world tmp3
1 1 hello world tmp1
2 1 hello world tmp2
0 1 hello world tmp0
3 1 hello world tmp3
1 2 hello world tmp1
2 2 hello world tmp2
0 2 hello world tmp0
3 2 hello world tmp3
1 3 hello world tmp1
2 3 hello world tmp2
0 3 hello world tmp0
3 3 hello world tmp3
1 4 hello world tmp1
2 4 hello world tmp2
0 4 hello world tmp0
3 4 hello world tmp3
```
答案 3 :(得分:-1)
您需要将该进程作为守护进程运行。
尝试在p.daemon = True
p.start()
p.join()
等待该过程完成。你也需要摆脱它