Форум сайта python.su
Есть некоторая ф-йия
def func(vals):
for val in vals:
fo_something(val)
for x in range(0,n):
thread = threading.Thread(target=func, args=[vals])
thread.start()
tsVals = ThreadSafeGeneratorWrapper(vals)
for x in range(0,n):
thread = threading.Thread(target=func, args=[tsVals])
thread.start()
Офлайн
А что означает thread safe для генератора?
Офлайн
Андрей СветловОзначет, что данные беруться несколькими потокамии при этом не возникает конфликтов доступа.
А что означает 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()
Офлайн
Напряженно думаю. А где конфликт доступа?
Офлайн
Андрей СветловВ самом генераторе, т.к. генерация очередного значения - не атомарная операция.
Напряженно думаю. А где конфликт доступа?
Офлайн
CEMEHЗдесь как раз пригодится очередь (см. модуль Queue).
Т.е. получается очередь данных, которые разбираются потоками.
Офлайн
Не годится по двум причинам:
1) как понимаю в очередь данные заносятся не зависимо от их выборки, а у меня генератор.
2) на самом деле у меня используется 2 независимых генератора
ну и ф-цию придется переписывать на использование очереди.
Отредактировано (Май 4, 2011 15:24:27)
Офлайн
В принципе LockedIterator, который привел выше, полностью подходит. Просто, думал, что такой велосипед уже есть в стандартных библиотеках.
Офлайн
Проблему понял. В стандартной библиотеке такого нет и не будет.
Вообще не уверен, что разделение генератора между потоками — хорошая идея. Как по мне — настоящий antipattern получается.
Впрочем, вам — виднее.
Офлайн
В 2.6.5+ есть multiprocessing. Не уверен насколько подойдет сам модуль, поскольку это вообще не threading а скорее альтернатива тредингу с ограничениями, но там есть Proxy объекты. И гдето в сети гуляла статья с примерами многозадачных итераторов сделанных на базе этих Proxy.
Офлайн