問(wèn)題描述
我在這里有一個(gè)非常簡(jiǎn)單的函數(shù),我試圖在其中運(yùn)行和測(cè)試,但是,它不輸出任何內(nèi)容,也沒有任何錯(cuò)誤.我已經(jīng)多次檢查代碼,但沒有任何錯(cuò)誤.
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.
我打印了作業(yè),結(jié)果如下:
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])>]
代碼如下:
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()
這是我期待的結(jié)果,但它沒有輸出任何東西:
Here's the result I'm expecting but it's not outputting anything:
Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
推薦答案
評(píng)論顯示 OP 使用 Windows 和 Spyder.由于 Spyder 重定向 stdout
而 Windows 不支持 forking,新的子進(jìn)程不會(huì)打印到 Spyder 控制臺(tái).這僅僅是因?yàn)樾伦舆M(jìn)程的 stdout
是 Python 的 vanilla stdout,也可以在 sys.__stdout__
中找到.
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__
.
有兩種選擇:
使用 logging 模塊.這將包括創(chuàng)建所有消息并將其記錄到一個(gè)或多個(gè)文件中.使用單個(gè)日志文件可能會(huì)導(dǎo)致輸出稍微亂碼的問(wèn)題,因?yàn)檫M(jìn)程會(huì)同時(shí)寫入文件.每個(gè)進(jìn)程使用一個(gè)文件可以解決這個(gè)問(wèn)題.
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.
不在子進(jìn)程中使用print
,而只是將結(jié)果返回給主進(jìn)程.通過(guò)使用 queue (或 multiprocessing.Manager().Queue()
因?yàn)榉植媸遣豢赡艿?或更簡(jiǎn)單地依靠 多處理池的 map
功能,請(qǐng)參見下面的示例.
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.
帶有池的多處理示例:
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()
哪個(gè)打印(在主進(jìn)程中)
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
<小時(shí)>
如果您迫不及待地等待 map
函數(shù)完成,您可以使用 imap_unordered
并稍微更改命令的順序立即打印結(jié)果:
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()
這篇關(guān)于Spyder中的簡(jiǎn)單Python多處理函數(shù)不輸出結(jié)果的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!