Simple Python Multiprocessing function in Spyder doesn't output results

前端 未结 1 1571
渐次进展
渐次进展 2020-11-29 10:33

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 check

1条回答
  •  有刺的猬
    2020-11-29 11:24

    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__.

    There are two alternatives:

    1. 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.

    2. 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()
    

    0 讨论(0)
提交回复
热议问题