Как остановить сопрограмму / поток в eventlet Python - PullRequest
1 голос
/ 26 мая 2011

Когда я использую пакет событий для запуска задачи с несколькими сопрограммами, даже когда пул сопрограмм пуст, программа не будет продолжать работать, но застрянет в цикле.Ниже приведен мой код, и последняя строка никогда не будет выполнена.

import eventlet

global count
post_id=[]
last_id=0

def download(post_id):
    global count
    print "coroutines :",post_id
    if count<last_id:
        count=count+1
        q.put(count) # put new coroutines  in the queue


pool = eventlet.GreenPool()
q = eventlet.Queue()

for i in range(100,200):
    post_id.append(i)

for i in range(0,5):
    q.put(post_id[i]) # keep 6 coroutines  in the pool

count=post_id[5]
last_id=200

while not q.empty() or pool.running()!=0:
    pool.spawn_n(download,q.get()) #start corroutines

print "The end" #nerver reach to this line

1 Ответ

1 голос
/ 22 июня 2011

Последняя строка никогда не выполняется, потому что ваш последний вызов q.get () блокируется навсегда, ожидая, что что-то будет добавлено в очередь. Есть несколько способов исправить это, в том числе передать значение тайм-аута для получения. Я думаю, что самое чистое решение состоит в том, чтобы дождаться завершения текущих задач, если очередь пуста, прежде чем снова попытаться повторить цикл:

while not q.empty():
    pool.spawn_n(download, q.get())
    if q.empty(): pool.waitall()
...