2016-12-06 1 views
0

Как я могу заставить следующее работать? Главное, что я хочу запустить метод (а не функцию) асинхронно.Могу ли я передать метод apply_async или карту в многопроцессорности python?

from multiprocessing import Pool 

class Async: 
    def __init__(self, pool): 
     self.pool = pool 
     self.run() 

    def run(self): 
     p.apply_async(self.f, (10,)) 

    def f(self, x): 
     print x*x 

if __name__ == '__main__': 
    p = Pool(5) 
    a = Async(p) 
    p.close() 
    p.join() 

Это не печатает.

+0

Добавьте a.run() соответственно. – Simon

+0

Исправлен метод запуска. Я нашел это возможное решение: http://stackoverflow.com/q/1816958/1545579 Должен попробовать ... возможно, он поможет ... будет обновлять – Mahdi

ответ

0

Проблема, как представляется, в связи с тем, что multiprocessing необходимо протравить self.f в то время как связанные методы не пригодны для консервирования. Обсуждается вопрос о том, как решить проблему here.

apply_async, по-видимому, создает исключение, которое помещается в будущее. Вот почему ничего не печатается. Если в будущем выполняется get, то возникает исключение.

0

Его определенно можно использовать методы класса, используя threadpool в python 2 - следующая программа сделала то, что я ожидал бы.

#!/usr/bin/env python 

from multiprocessing.pool import ThreadPool 

class TestAsync(): 
    def __init__(self): 
    pool = ThreadPool(processes = 2) 

    async_completions = [] 
    for a in range(2): 
     async_completions.append(pool.apply_async(self.print_int, ( a,))) 

    for completion in async_completions: 
     res = completion.get() 
     print("res = %d" % res) 

    def print_int(self, value): 
    print(value) 
    return (value*10) 


a = TestAsync() 
+0

Спасибо @fankster. Это действительно работает. Единственная проблема, насколько я понимаю, ThreadPool по-прежнему будет использовать один «процесс» (другими словами, будет работать только на одном ядре). Ваш ответ будет полезен, если это не проблема, но я хочу работать на нескольких ядрах. – Mahdi

Смежные вопросы