Существует Konfabulator Yahoo для рабочего стола окон.
Я предлагаю вам создать экземпляр Queue.Queue перед запуском цепочки, и передать его как один из аргументов потока: перед тем, как поток завершится, он . поместит
результат в очередь, которую он получил в качестве аргумента. Родитель может .get
или .get_nowait
по желанию.
Очереди, как правило, являются лучшим способом организовать синхронизацию потоков и обмен данными в Python: они изначально ориентированы на потоки, средства передачи сообщений - лучший способ организовать многозадачность в целом! -)
Другой подход - передать потоку функцию обратного вызова. Это дает простой, безопасный и гибкий способ вернуть значение родительскому элементу в любое время из нового потока.
# A sample implementation
import threading
import time
class MyThread(threading.Thread):
def __init__(self, cb):
threading.Thread.__init__(self)
self.callback = cb
def run(self):
for i in range(10):
self.callback(i)
time.sleep(1)
# test
import sys
def count(x):
print x
sys.stdout.flush()
t = MyThread(count)
t.start()
Что ж, в модуле потоковой передачи Python есть объекты состояния, связанные с блокировками. Один метод Acquire ()
вернет любое значение, возвращаемое базовым методом. Для получения дополнительной информации: Объекты условий Python
Если вы вызывали join (), чтобы дождаться завершения потока, вы могли бы просто прикрепить результат к самому экземпляру потока, а затем получить его из основного потока после того, как join () вернется .
С другой стороны, вы не говорите нам, как вы собираетесь обнаружить, что поток завершен и что результат доступен. Если у вас уже есть способ сделать это, он, вероятно, укажет вам (и нам, если вы сообщите нам) лучший способ получения результатов.