[多处理python]:无输出

[multiprocessing python]: no output

有人可以解释一下为什么当我尝试执行下面的示例时,我没有结果。 我也试图将输出重定向到一个文件中,但没有成功。

from multiprocessing import Process
def proc(i):
    print(f'I am Process {i}')
if __name__ ==  '__main__':
    for i in range(10):
        Process(target=proc, args=(i,)).start()

通常,我的输出是:

I am Process 6
I am Process 2
I am Process 0
I am Process 3
I am Process 7
I am Process 4
I am Process 8
I am Process 1
I am Process 5
I am Process 9

但就我而言,我没有结果。

您需要强制刷新,否则输出将仅在缓冲区已满时可见:

def proc(i):
    print(f'I am Process {i}')
    sys.stdout.flush()

PS:您在检查 __name__ 时也有错字。应该是if __name__ == '__main__':

这可能是 if _name_ == '__main__': 中缺少下划线的错字。

运行:

from multiprocessing import Process

def proc(i):
    print(f'I am Process {i}')

if __name__ == '__main__':
    for i in range(10):
        Process(target=proc, args=(i,)).start()

在我的机器上returns正确的输出

如果您必须 运行 在 Notebook 下(并已根据需要将您的工作函数移至外部模块)并且您希望在 Notebook 中查看打印输出,则需要安排打印完成通过主要(启动)过程。这意味着启动的进程需要 return 将字符串打印回启动进程。有几种方法可以做到这一点。在这里,我使用了一个带有回调函数的多处理池,这样一旦结果准备就绪,主进程就会用结果回调:

from multiprocessing import Pool
from workers import proc

def on_completion(result):
    print(result)

if __name__ ==  '__main__':
    pool = Pool(10)
    results = [pool.apply_async(proc, args=(i,), callback=on_completion) for i in range(10)]
    pool.close()
    pool.join() # wait for worker processes to exit

第二种更简单的方法:

from multiprocessing import Pool
from workers import proc


if __name__ ==  '__main__':
    pool = Pool(10)
    results = pool.imap_unordered(proc, range(10))
    # print the results as they become available:
    for result in results:
        print(result)

使用 ProcessPoolExecutor:

from concurrent.futures import ProcessPoolExecutor, as_completed
from workers import proc


if __name__ ==  '__main__':
    with ProcessPoolExecutor(max_workers=10) as executor:
        futures = [executor.submit(proc, i) for i in range(10)]
        for f in as_completed(futures):
            print(f.result())