Уведомления

Группа в Telegram: @pythonsu

#1 Март 18, 2012 09:56:03

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

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 аналог, который я давно искал :)



Офлайн

#2 Март 18, 2012 10:46:11

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Нет, погорячился, вариант работает только для обычных функций, которые может упаковать 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)

Офлайн

#3 Март 18, 2012 12:09:56

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Это известное ограничение 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



Офлайн

#4 Сен. 16, 2012 10:58:56

DevNul_Pavel
От:
Зарегистрирован: 2012-03-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Взаимодействие между потоками с помощью сигналов

Действительно работает! Спасибо



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version