【问题标题】:Multiprocessing on Python 3 JupyterPython 3 Jupyter 上的多处理
【发布时间】:2018-06-19 21:46:32
【问题描述】:

我来这里是因为我的 Jupiter 的 Python3 笔记本有问题。 我需要创建一个使用多处理库的函数。 在实现它之前,我做了一些测试。 我发现了很多不同的示例,但问题每次都相同:我的代码已执行,但笔记本界面中没有任何反应:

我尝试在 jupyter 上运行的代码是这样的:

import os

from multiprocessing import Process, current_process


def doubler(number):
    """
    A doubling function that can be used by a process
    """
    result = number * 2
    proc_name = current_process().name
    print('{0} doubled to {1} by: {2}'.format(
        number, result, proc_name))
    return result


if __name__ == '__main__':
    numbers = [5, 10, 15, 20, 25]
    procs = []
    proc = Process(target=doubler, args=(5,))

    for index, number in enumerate(numbers):
        proc = Process(target=doubler, args=(number,))
        proc2 = Process(target=doubler, args=(number,))
        procs.append(proc)
        procs.append(proc2)
        proc.start()
        proc2.start()

    proc = Process(target=doubler, name='Test', args=(2,))
    proc.start()
    procs.append(proc)

    for proc in procs:
        proc.join()

当我在没有 Jupyter 的情况下运行我的代码但使用命令“python my_progrem.py”时没关系,我可以看到日志:

对于我的示例,在 Jupyter 中,是否有一种方法可以在我可以在之后使用的变量/对象中捕获我的两个任务(proc1 和 proc2,它们都调用函数“doubler”)的结果? 如果“是”,我该怎么做?

【问题讨论】:

    标签: multiprocessing jupyter-notebook python-3.6


    【解决方案1】:

    @Konate 的回答对我很有帮助。这是使用 multiprocessing.pool 的简化版本:

    import multiprocessing
    
    def double(a):
        return a * 2
    
    def driver_func():
        PROCESSES = 4
        with multiprocessing.Pool(PROCESSES) as pool:
            params = [(1, ), (2, ), (3, ), (4, )]
            results = [pool.apply_async(double, p) for p in params]
    
            for r in results:
                print('\t', r.get())
    
    

    【讨论】:

    • @Kamen Tsvetkov,感谢您分享您的方法。我在我的windows机器上试过了,好像driver_func()只是挂在那里没有输出任何东西
    • 感谢您分享您的解决方案。运行时与非并行版本相比如何?
    【解决方案2】:

    我通过使用 multiprocessing.pool 成功了。 我受到这种方法的启发:

    def test():
        PROCESSES = 4
        print('Creating pool with %d processes\n' % PROCESSES)
    
    with multiprocessing.Pool(PROCESSES) as pool:
        TASKS = [(mul, (i, 7)) for i in range(10)] + \
                [(plus, (i, 8)) for i in range(10)]
    
        results = [pool.apply_async(calculate, t) for t in TASKS]
        imap_it = pool.imap(calculatestar, TASKS)
        imap_unordered_it = pool.imap_unordered(calculatestar, TASKS)
    
        print('Ordered results using pool.apply_async():')
        for r in results:
            print('\t', r.get())
        print()
    
        print('Ordered results using pool.imap():')
        for x in imap_it:
            print('\t', x)
    

    ...等 更多信息,代码在:https://docs.python.org/3.4/library/multiprocessing.html?

    【讨论】:

      【解决方案3】:

      在 Jupyter 笔记本中运行多处理作业的另一种方法是使用 nbmultitask 包支持的方法之一。

      【讨论】:

        【解决方案4】:

        这适用于我在 MAC 上(不能让它在 Windows 上运行):

            import multiprocessing as mp
            mp_start_count = 0
        
            if __name__ == '__main__':
                if mp_start_count == 0:
                    mp.set_start_method('fork')
                    mp_start_count += 1
        

        【讨论】:

          猜你喜欢
          • 2018-04-29
          • 2020-05-07
          • 1970-01-01
          • 1970-01-01
          • 2014-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多