Python 3 Jupyter 上的多处理

Kon*_*ick 12 multiprocessing jupyter-notebook python-3.6

我来这里是因为我的 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()
Run Code Online (Sandbox Code Playgroud)

当我在没有 Jupyter 的情况下运行我的代码但使用命令“python my_progrem.py”时,我可以看到日志: 在此处输入图片说明

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

Kam*_*kov 9

@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())

Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • @Kamen Tsvetkov,感谢您分享您的方法。我在我的 Windows 机器上尝试过,似乎 driver_func() 只是挂在那里而不输出任何内容 (19认同)
  • 不适用于 mac + JupyterLab (4认同)

psy*_*dia 8

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


Kon*_*ick 7

我通过使用 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)
Run Code Online (Sandbox Code Playgroud)

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