多进程无法在python3中并行工作

时间:2017-10-12 12:38:40

标签: python multithreading python-3.x multiprocessing python-multiprocessing

我想使用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)

4 个答案:

答案 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()等待该过程完成。你也需要摆脱它