как я могу обновить общую переменную между различными потоками. Поток в python?
Допустим, у меня есть 5 потоков, работающих над Queue.Queue ().После завершения очереди я хочу выполнить другую операцию, но я хочу, чтобы это произошло только один раз.
Можно ли совместно использовать и обновлять переменную между потоками.поэтому, когда Queue.empty () имеет значение True, это событие запускается, но если один из потоков делает это, я не хочу, чтобы другие делали это тоже, потому что я получил бы неправильные результаты.
РЕДАКТИРОВАТЬ
У меня есть очередь, которая отражает файлы в файловой системе.файлы загружаются на сайт потоками, и в то время как каждый поток загружает файл, он обновляет набор () ключевых слов, которые я получил из файлов.
когда очередь пуста, мне нужно связаться с сайтом и сказать ему:обновить количество ключевых слов.Прямо сейчас каждый поток делает это, и я получаю обновление для каждого потока, что плохо.я также пытался очистить набор, но он не работает.
keywordset = set()
hkeywordset = set()
def worker():
while queue:
if queue.empty():
if len(keywordset) or len(hkeywordset):
# as soon as the queue is empty we send the keywords and hkeywords to the
# imageapp so it can start updating
apiurl = update_cols_url
if apiurl[-1] != '/':
apiurl = apiurl+'/'
try:
keywords = []
data = dict(keywords=list(keywordset), hkeywords=list(hkeywordset))
post = dict(data=simplejson.dumps(data))
post = urllib.urlencode(post)
urllib2.urlopen(apiurl, post)
hkeywordset.clear()
keywordset.clear()
print 'sent keywords and hkeywords to imageapp...'
except Exception, e: print e
# we get the task form the Queue and process the file based on the action
task = queue.get()
print str(task)
try:
reindex = task['reindex']
except:
reindex = False
data = updater.process_file(task['filename'], task['action'], task['fnamechange'], reindex)
# we parse the images keywords and hkeywords and add them to the sets above for later
# processing
try:
for keyword in data['keywords']:
keywordset.add(keyword)
except: pass
try:
for hkw in data['hkeywords']:
hkeywordset.add(hkw)
except:pass
queue.task_done()
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
t.daemon = True
t.start()
while 1:
line = raw_input('type \'q\' to stop filewatcher... or \'qq\' to force quit...\n').strip()
это то, что я пытался в принципе.но, конечно, часть queue.empty () исполняется столько раз, сколько у меня потоков.