Форум сайта python.su
from multiprocessing.pool import Pool
from multiprocessing import current_process
def test_func():
print("process = " + current_process().name)
return current_process().name
def call_back(result):
print("callack = " + current_process().name)
return current_process().name
if __name__ == "__main__":
current_process().name = "MainThread"
pool = Pool(processes=5)
result = pool.apply_async(test_func, callback=call_back).get()
Офлайн
Нет, погорячился, вариант работает только для обычных функций, которые может упаковать pickle для передачи в другой процесс
def call_back(result):
print("callack = " + current_process().name)
return current_process().name
class TestClass:
def __init__(self):
pass
def test_f(self):
print("process = " + current_process().name)
return current_process().name
if __name__ == "__main__":
m = TestClass()
current_process().name = "MainThread"
pool = Pool(processes=5)
result = pool.apply_async(m.test_f, callback=call_back).get()
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Python32\lib\threading.py", line 740, in _bootstrap_inner
self.run()
File "C:\Python32\lib\threading.py", line 693, in run
self._target(*self._args, **self._kwargs)
File "C:\Python32\lib\multiprocessing\pool.py", line 342, in _handle_tasks
put(task)
_pickle.PicklingError: Can't pickle <class 'method'>: attribute lookup builtins.method failed
Отредактировано (Март 18, 2012 10:47:04)
Офлайн
Это известное ограничение multiprocessing. Ему нужно, чтобы все пиклилось. На мой взгляд не очень критичное. В конце концов можно и без классов обойтись. Зато все из коробки.
Вот вам враппер:
def wrapper():
return m.test_f()
if __name__ == “__main__”:
m = TestClass()
current_process().name = “MainThread”
pool = Pool(processes=5)
result = pool.apply_async(wrapper, callback=call_back).get()
PS: Я работал с selery. Тяжелая штука, мне не понравилась. Как-то все заморочено. Если уж так нужно дистрибутить таски между хостами, то тот же multiprocessing это умеет: http://docs.python.org/library/multiprocessing.html?highlight=multiprocessing#using-a-remote-manager
Офлайн
Действительно работает! Спасибо
Офлайн