Spyder中的简单Python多处理功能不会输出结果

Ope*_*nCv 3 python process multiprocessing

我有这个非常简单的功能,我正在尝试运行和测试,但是,它没有输出任何东西,它也没有任何错误.我已多次检查代码,但没有任何错误.

我打印了工作,这是我得到的:

[<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])>]
Run Code Online (Sandbox Code Playgroud)

这是代码:

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()
Run Code Online (Sandbox Code Playgroud)

这是我期待的结果,但它没有输出任何东西:

Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
Run Code Online (Sandbox Code Playgroud)

SmC*_*lar 6

评论显示OP使用Windows以及Spyder.由于Spyder重定向stdout并且Windows不支持分叉,因此新的子进程将不会打印到Spyder控制台中.这只是因为stdout新的子进程是Python的vanilla stdout,也可以在其中找到sys.__stdout__.

有两种选择:

  1. 使用日志记录模块.这将包括创建所有消息并将其记录到一个或多个文件.使用单个日志文件可能会导致输出稍微出现问题,因为进程会同时写入文件.每个进程使用一个文件可以解决这个问题.

  2. 不在print子进程中使用,而只是将结果返回到主进程.通过使用队列(或multiprocessing.Manager().Queue()因为不可能分叉)或更简单地依靠多处理池的 map功能,请参见下面的示例.

带池的多处理示例:

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()
Run Code Online (Sandbox Code Playgroud)

打印(在主要过程中)

worker 0
worker 1
worker 2
worker 3
worker 4
worker 5
worker 6
worker 7
worker 8
worker 9
Run Code Online (Sandbox Code Playgroud)

编辑:如果您不耐烦等待map功能完成,您可以通过使用imap_unordered并稍微更改命令的顺序立即打印您的结果:

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()
Run Code Online (Sandbox Code Playgroud)

  • 您也可以尝试使用`imap_unordered`并立即打印结果,看看我的编辑.然后,您也可以发现未完成的作业并导致无限循环. (2认同)