Добавьте аргумент тайм-аута Queue.join Python ()

Когда я начал смотреть на WPF, я рассматривал его как "Winforms с Векторной графикой" и работал прямо в сторону утеса изучения. Надлежащий способ перейти от WinForms до WPF состоит в том, чтобы принять героическую дозу любого наркотика, можно тронуть то, для упущения всего, что Вы знаете, затем запускаете с нуля.

Серьезно, хотя - это намного более чисто и легче при использовании шаблона, такого как Model-View-ViewModel. Читайте больше в Orbifold, этот поток Google Groups и Channel9

Тогда в какой-то момент, Вы будете иметь прозрение и начнете связывать с данными все. Ваш код - позади станет не намного больше, чем вызов к InitializeComponent ().

16
задан olamundo 14 October 2009 в 06:02
поделиться

3 ответа

Создание подкласса Очередь , вероятно, является лучшим способом. Примерно так должно работать (непроверено):

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()
20
ответ дан 30 November 2019 в 16:58
поделиться

Сначала вы должны убедиться, что все ваши рабочие потоки в очереди завершаются с помощью task_done ()

Чтобы реализовать функцию тайм-аута с Queue , вы можете обернуть код очереди в поток и добавить тайм-аут для этого потока, используя Thread.join ([timeout])

непроверенный пример, чтобы обозначить, что Я предлагаю

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
0
ответ дан 30 November 2019 в 16:58
поделиться

Метод join () предназначен для ожидания выполнения всех задач. Если вам все равно, действительно ли задачи завершены, вы можете периодически опрашивать счетчик незавершенных задач:

stop = time() + timeout
while q.unfinished_tasks and time() < stop:
    sleep(1)

Этот цикл будет существовать либо когда задачи будут выполнены, либо когда истечет период тайм-аута.

Раймонд

15
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: