[多处理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())
有人可以解释一下为什么当我尝试执行下面的示例时,我没有结果。 我也试图将输出重定向到一个文件中,但没有成功。
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())