многопроцессорный обратный вызов внутри метода не работает - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь запустить многопроцессорную обработку внутри метода.Однако обратный вызов не работает должным образом.

Вот пример того, чего мне нужно достичь.

from multiprocessing import Pool
from time import sleep
import random

def sum(task, a, b): 
    sleepTime = random.randint(1, 4)
    print(task, " requires ", sleepTime, " seconds to finish")
    sleep(sleepTime)
    return a+b 

def printResult(result):
    print(result)

myPool = Pool(5)

result1 = myPool.apply_async(sum, args=("task1", 10, 20,), callback = printResult)
result2 = myPool.apply_async(sum, args=("task2", 20, 30,), callback = printResult)
result3 = myPool.apply_async(sum, args=("task3", 30, 40,), callback = printResult)
result4 = myPool.apply_async(sum, args=("task4", 40, 50,), callback = printResult)
result5 = myPool.apply_async(sum, args=("task5", 50, 60,), callback = printResult)

print("Submitted tasks to pool")

myPool.close()
myPool.join()

Это прекрасно работает, возвращая

Submitted tasks to pool
task1  requires  3  seconds to finish
task2  requires  4  seconds to finish
task3  requires  1  seconds to finish
task4  requires  4  seconds to finish
task5  requires  1  seconds to finish
110
70
30
50
90

Однако, когда я оборачиваю многопроцессорную обработку внутри метода и вызываю этот метод, кажется, что она не работает должным образом.

например,

def run_mp():
    from multiprocessing import Pool
    from time import sleep
    import random

    def sum(task, a, b): 
        sleepTime = random.randint(1, 4)
        print(task, " requires ", sleepTime, " seconds to finish")
        sleep(sleepTime)
        return a+b 

    def printResult(result):
        print(result)

    myPool = Pool(5)

    result1 = myPool.apply_async(sum, args=("task1", 10, 20,), callback = printResult)
    result2 = myPool.apply_async(sum, args=("task2", 20, 30,), callback = printResult)
    result3 = myPool.apply_async(sum, args=("task3", 30, 40,), callback = printResult)
    result4 = myPool.apply_async(sum, args=("task4", 40, 50,), callback = printResult)
    result5 = myPool.apply_async(sum, args=("task5", 50, 60,), callback = printResult)

    print("Submitted tasks to pool")

    myPool.close()
    myPool.join()

, когда вызывается run_mp(), он просто возвращает следующее.

Submitted tasks to pool

Это не просто проблема с печатью стандартного вывода на экране.В реальной проблеме, с которой я имею дело, похоже, нет правильного вызова функции обратного вызова.

1 Ответ

1 голос
/ 21 мая 2019

Простой ответ. Невозможно или, по крайней мере, легко выбрать метод класса с помощью multiprocessing. Есть форк multiprocessing, называемый multiprocess (автором которого я являюсь), который использует сериализатор dill ... и обеспечивает именно то поведение, которое вы ищете.

Просто замените from multiprocessing на from multiprocess, и ваш код будет работать как положено.

...