python多进程 输出没有回车_【Python】python多进程,函数内print的内容没有打印出来...

在Windows上使用Spyder进行Python多进程编程时,由于stdout重定向和Windows不支持forking,子进程的print内容不会显示。解决方法包括使用logging模块记录日志或通过返回值传递结果,例如使用multiprocessing Pool的map功能。示例代码展示了如何在主进程中正确获取并打印子进程的返回结果。
摘要由CSDN通过智能技术生成

问题:python多进程,子函数内容没有打印出来。

Simple Python Multiprocessing function doesn't output results

I have this very simple function right here in which I'm trying to run and test on, however, it doesn't output anything and it doesn't have any errors either. I've checked the code multiple times but it doesn't have any errors.

I printed jobs and here's what I got:

[,,,,]

Here's the code:

importmultiprocessingdefworker(num):print"worker ",numreturnjobs=[]foriinrange(5):p=multiprocessing.Process(target=worker,args=(i,))jobs.append(p)p.start()

Here's the result I'm expecting but it's not outputting anything:

Worker:0Worker:1Worker:2Worker:3Worker:4

原因:spyder使用的stdout和windows不支持forking,所以无法打印子进程内容。

The comments revealed that OP uses Windows as well as Spyder. Since Spyder redirectsstdoutand Windows does not supportforking, a new child process won't print into the Spyder console. This is simply due to the fact thatstdoutof the new child process is Python's vanilla stdout, which can also be found insys.__stdout__.

解决:1.打印日志到文件。2.用返回值替代打印。

There are two alternatives:

Using the logging module. This would encompass creating and logging all messages to one or several files. Using a single log-file may lead to the problem that the output is slightly garbled since the processes would write concurrently to the file. Using a single file per process could solve this.

Not using print within the child processes, but simply returning the result to the main process. Either by using a queue (or multiprocessing.Manager().Queue() since forking is not possible) or more simply by relying on the multiprocessing Pool's map functionality, see example below.

Multiprocessing example with a Pool:

importmultiprocessingdefworker(num):"""Returns the string of interest"""return"worker %d"%numdefmain():pool=multiprocessing.Pool(4)results=pool.map(worker,range(10))pool.close()pool.join()forresultinresults:# prints the result string in the main processprint(result)if__name__=='__main__':# Better protect your main function when you use multiprocessingmain()

which prints (in the main process)

worker0worker1worker2worker3worker4worker5worker6worker7worker8worker9

EDIT: If you are to impatient to wait for the map function to finish, you can immediately print your results by using imap_unordered and slightly changing the order of the commands:

defmain():pool=multiprocessing.Pool(4)results=pool.imap_unordered(worker,range(10))forresultinresults:# prints the result string in the main process as soon as say are ready# but results are now no longer in order!print(result)# The pool should join after printing all resultspool.close()pool.join()来源:https://stackoverflow.com/questions/29629103/simple-python-multiprocessing-function-doesnt-output-results/29632397#29632397

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值