Kuyruk sınıfına katılabilmek() ancak bir süre sonra çağrı henüz dönmediyse zaman aşımına uğramak istiyorum. Bunu yapmanın en iyi yolu nedir? Meta sınıfını kullanarak alt sınıf sıralaması yapmak mümkün mü?Zaman aşımı argümanı python'un Queue.join() öğesine ekleyin
cevap
Subclassing Queue
muhtemelen en iyi yoldur. Böyle bir şey (denenmemiş) çalışması gerekir:
def join_with_timeout(self, timeout):
self.all_tasks_done.acquire()
try:
endtime = time() + timeout
while self.unfinished_tasks:
remaining = endtime - time()
if remaining <= 0.0:
raise NotFinished
self.all_tasks_done.wait(remaining)
finally:
self.all_tasks_done.release()
Teşekkür sağlamak istiyorum! All_task_done hakkında nereden bilgi aldınız? Ben http://docs.python.org/library/queue.html#module-Queue baktım ama bu memeber herhangi bir söz görmüyorum ... – olamundo
Kuyruk için kaynak kodunu okuyabilirsiniz. Bu 'koymak' ve 'almak' için uygulanan bir 'timeout' parametresi vardır, benzer bir yaklaşım kullanmak için 'katılmak' genişletmek için yeterince kolay oldu. –
Hmm, akıllı çözüm;) – tuergeist
İlk başta, bir Thread Queue kodunu sarar task_done()
ile kuyruk çıkışında tüm çalışma ipler Queue
ile bir zaman aşımı işlevselliğini uygulamak için emin olmalıdır ve kullanma Bu Konudaki bir zaman aşımı eklemek
denenmemiş örnek Thread.join([timeout])
önerim özetlemek
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
def queuefunc():
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.setDaemon(True)
t.start()
for item in source():
q.put(item)
q.join() # block until all tasks are done
t = Thread(target=queuefunc)
t.start()
t.join(100) # timeout applies here
() yöntem Bütün görevler bekliyor konuda yapılması gereken edilir katılmak. Eğer görevleri fiilen bitmiş umrumda yoksa, belirli aralıklarla tamamlanmamış görev sayımını yoklamak:
stop = time() + timeout
while q.unfinished_tasks and time() < stop:
sleep(1)
Bu döngü var olacaktır, ya görevler bittiğinde veya zaman aşımı süresi dolduğunda.
Raymond
O task_done tüm çalışan iş parçacığı ucu() – tuergeist