Как я могу обновить общую переменную между различными threading.Thread в python?python threading и shared variables
позволяет говорить, что у меня есть 5 потоков, работающих вниз Queue.Queue(). после завершения очереди я хочу выполнить другую операцию, но я хочу, чтобы это произошло только один раз.
Можно ли делиться и обновлять переменную между потоками. поэтому, когда Queue.empty() True, это событие запускается, но если один из потоков делает это, я не хочу, чтобы другие делали это, потому что я получал неправильные результаты.
EDIT
У меня есть очереди, которая отражает файлы в файловой системе. файлы загружаются на сайт по потокам, и в то время как каждый поток загружает файл, он обновляет набор() ключевых слов, которые я получил из файлов.
Когда очередь пуста, мне нужно связаться с сайтом и сообщить об этом, чтобы обновить количество ключевых слов. прямо сейчас каждый поток делает это, и я получаю обновление для каждого потока, который является плохим. Я также пытался очистить набор, но он не работает.
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() получает exectued столько раз, сколько у меня есть потоки.
извините, но я действительно не понимаю, что вы имеете в виду. – aschmid00
@ aschmid00: __sorry, но я действительно не понимаю, что вы имеете в виду. Это то же самое для меня? я хотел помочь, но я думаю, что я просто сделаю вас более смущенными, я думаю, что удалю этот ответ, если вы не дадите нам больше подробностей о том, что вы хотите сделать, и, возможно, какой-то код, чтобы понять больше проблемы, надеюсь, вы найдете ответы на свои вопросы :) – mouad
спасибо !! я попробую это как можно скорее и дам вам знать. – aschmid00