Chcę móc dołączyć() do klasy Queue, ale po jakimś czasie limit czasu, jeśli połączenie jeszcze nie wróciło. Jaki jest najlepszy sposób na zrobienie tego? Czy można to zrobić poprzez podklasowanie kolejki \ przy użyciu metaclass?Dodaj argument timeout do kolejki Pythona.join()
Odpowiedz
Utworzenie podklasy Queue
to prawdopodobnie najlepszy sposób. Coś jak to powinno działać (niesprawdzone):
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()
Dzięki! Skąd masz informacje o all_task_done? Zajrzałem do http://docs.python.org/library/queue.html#module-Queue, ale nie widzę żadnej wzmianki o tym memu ... – olamundo
Możesz przeczytać kod źródłowy Queue. Ma parametr 'timeout' wprowadzony dla' put' i 'get', łatwo było rozszerzyć' join', aby zastosować podobne podejście. –
Hmm, inteligentne rozwiązanie;) – tuergeist
Najpierw należy upewnić się, że wszystkie wątki pracujące w wyjściu kolejki z task_done()
Aby wdrożyć funkcję limitu czasu z Queue
można owinąć kod kolejce za w wątku i dodać czas oczekiwania na ten temat za pomocą Thread.join([timeout])
nietestowanego przykład zarys tego, co proponuję
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
join() metoda jest o czekając na wszystkich zadań do zrobienia. Jeśli nie obchodzi, czy zadania zostały faktycznie zakończone, można okresowo sondować niedokończone liczyć zadanie:
stop = time() + timeout
while q.unfinished_tasks and time() < stop:
sleep(1)
Pętla ta będzie istnieć albo gdy zadania są wykonywane lub gdy upłynie limit czasu.
Raymond
- 1. Dodaj argument do argumentów następnie zastosuj
- 2. MSMQ Receive() metoda timeout
- 3. Przekazywanie parametrów do angulajs $ timeout
- 4. Timeout podprocesu w języku Python?
- 5. Przeniesienie wiadomości z kolejki martwej litery do kolejki wychodzącej MSMQ
- 6. Heroku Timeout :: timeout nie wyrzuca błędu
- 7. timeout cancellationtoken vs task.delay() i timeout
- 8. 'rescue in rbuf_fill': Timeout :: Error (Timeout :: Error)
- 9. timeout rqworker
- 10. Forms Authentication Timeout vs Session Timeout
- 11. enable_if to Dodaj parametr funkcji, który ma domyślny argument?
- 12. argument do funkcji
- 13. Dodaj dodatkową ścieżkę do exec-maven-plugin
- 14. Jak dodać timeout do funkcji w Pythonie
- 15. Synchronizacja kolejki
- 16. LINQ do SQL - nie Dodaj metody Dodaj
- 17. Szyny - dodaj atrybuty i dodaj do tablicy
- 18. Timeout RestKit Ignorowany
- 19. HTTP, 408 Request timeout
- 20. Dodawanie timeout DatagramSocket - odbiór()
- 21. ADO.Net DataReader timeout issue
- 22. Implementacja C# timeout
- 23. Selen Firefox Otwórz Timeout
- 24. Java Native Timeout Process
- 25. timeout strony phantomJS
- 26. Uchwyt TimeOut :: Błąd ponownego
- 27. PHP Session Timeout
- 28. RestSharp.RestClient ignoruje timeout
- 29. Przekaż argument do funkcji AsyncCallback?
- 30. Angularjs - Przekaż argument do dyrektywy
by upewnić się, że wszystko skończy wątek pracownik task_done() – tuergeist