Уведомления

Группа в Telegram: @pythonsu

#1 Май 4, 2011 14:03:15

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

thread-safe generator

Есть некоторая ф-йия

def func(vals):
for val in vals:
fo_something(val)
где в качестве vals передается генератор.
Понадобилось сделать вызов этой ф-ции многопоточным. Т.е. что-то типа:
for x in range(0,n):
thread = threading.Thread(target=func, args=[vals])
thread.start()
Есть ли готовые решения thread-safe оберток над генератором, чтоб не изменять func ?
Т.е. в идеале хотелось бы:
tsVals = ThreadSafeGeneratorWrapper(vals)
for x in range(0,n):
thread = threading.Thread(target=func, args=[tsVals])
thread.start()



Офлайн

#2 Май 4, 2011 14:51:30

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

thread-safe generator

А что означает thread safe для генератора?



Офлайн

#3 Май 4, 2011 15:00:40

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

thread-safe generator

Андрей Светлов
А что означает thread safe для генератора?
Означет, что данные беруться несколькими потокамии при этом не возникает конфликтов доступа.
Вот эта ф-ция работает одновременно в нескольких потоках:
def func(vals):
for val in vals:
fo_something(val)
на каждой итерации из генератора выбирается очередное значение.
Т.е. получается очередь данных, которые разбираются потоками.
Но очередь не сформирована изначально, а данные генерируются по ходу обращения.

Пока собираюсь заюзать такой враппер:
class LockedIterator(object):
def __init__(self, it):
self.lock = threading.Lock()
self.it = it.__iter__()

def __iter__(self): return self

def next(self):
self.lock.acquire()
try:
return self.it.next()
finally:
self.lock.release()



Офлайн

#4 Май 4, 2011 15:07:46

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

thread-safe generator

Напряженно думаю. А где конфликт доступа?



Офлайн

#5 Май 4, 2011 15:12:09

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

thread-safe generator

Андрей Светлов
Напряженно думаю. А где конфликт доступа?
В самом генераторе, т.к. генерация очередного значения - не атомарная операция.



Офлайн

#6 Май 4, 2011 15:14:51

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

thread-safe generator

CEMEH
Т.е. получается очередь данных, которые разбираются потоками.
Здесь как раз пригодится очередь (см. модуль Queue).



Офлайн

#7 Май 4, 2011 15:23:36

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

thread-safe generator

Не годится по двум причинам:
1) как понимаю в очередь данные заносятся не зависимо от их выборки, а у меня генератор.
2) на самом деле у меня используется 2 независимых генератора

ну и ф-цию придется переписывать на использование очереди.



Отредактировано (Май 4, 2011 15:24:27)

Офлайн

#8 Май 4, 2011 15:25:45

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

thread-safe generator

В принципе LockedIterator, который привел выше, полностью подходит. Просто, думал, что такой велосипед уже есть в стандартных библиотеках.



Офлайн

#9 Май 4, 2011 17:47:01

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

thread-safe generator

Проблему понял. В стандартной библиотеке такого нет и не будет.
Вообще не уверен, что разделение генератора между потоками — хорошая идея. Как по мне — настоящий antipattern получается.
Впрочем, вам — виднее.



Офлайн

#10 Май 4, 2011 19:35:34

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

thread-safe generator

В 2.6.5+ есть multiprocessing. Не уверен насколько подойдет сам модуль, поскольку это вообще не threading а скорее альтернатива тредингу с ограничениями, но там есть Proxy объекты. И гдето в сети гуляла статья с примерами многозадачных итераторов сделанных на базе этих Proxy.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version