Найти - Пользователи
Полная версия: Взаимодействие между потоками с помощью сигналов
Начало » Python для экспертов » Взаимодействие между потоками с помощью сигналов
1 2
DevNul_Pavel
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()
>> process = PoolWorker-2
>> callack = MainThread

Спасибо! Кажется, это и есть Objective-C аналог, который я давно искал :)
DevNul_Pavel
Нет, погорячился, вариант работает только для обычных функций, которые может упаковать 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
попытки написать врапперфункцию не увенчались успехом
Ed
Это известное ограничение 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
DevNul_Pavel
Действительно работает! Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB