您的位置:首页 > 编程语言 > Python开发

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

2017-12-22 16:41 471 查看
问题: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:
[<Process(Process-12, stopped[1])>,
<Process(Process-13, stopped[1])>,
<Process(Process-14, stopped[1])>,
<Process(Process-15, stopped[1])>,
<Process(Process-16, stopped[1])>]
Here's the code:
import multiprocessing

def worker(num):
print "worker ", num
return

jobs = []
for i in range(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: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
原因:spyder使用的stdout和windows不支持forking,所以无法打印子进程内容。The comments revealed that OP uses Windows as well as Spyder. Since Spyder redirects 
stdout
and Windows does not support forking, a new child process won't print into the Spyder console. This is simply due to the fact that 
stdout
 of the new child process is Python's vanilla stdout, which can also be found in 
sys.__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:
import multiprocessing

def worker(num):
"""Returns the string of interest"""
return "worker %d" % num

def main():
pool = multiprocessing.Pool(4)
results = pool.map(worker, range(10))

pool.close()
pool.join()

for result in results:
# prints the result string in the main process
print(result)

if __name__ == '__main__':
# Better protect your main function when you use multiprocessing
main()
which prints (in the main process)
worker 0
worker 1
worker 2
worker 3
worker 4
worker 5
worker 6
worker 7
worker 8
worker 9
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:
def main():
pool = multiprocessing.Pool(4)
results = pool.imap_unordered(worker, range(10))

for result in results:
# 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 results
pool.close()
pool.join()
来源:https://stackoverflow.com/questions/29629103/simple-python-multiprocessing-function-doesnt-output-results/29632397#29632397
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: