Программа не возвращает код завершения, даже если последняя строка кода была запущена при написании monkey.patch_all () - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь использовать gevent для ускорения процесса загрузки изображения.Он не закончился с кодом возврата, даже вся программа дошла до нижней строки.Если вы удалите строку monkey.patch_all(), она будет работать нормально.

Я импортирую обезьяну в первую строку программы, а вторая строка - monkey.patch_all().

часть gevent:

from gevent import monkey
monkey.patch_all(thread=False,socket=False)
from gevent.pool import Pool
import socket
import os,time,re
...(other library)


pool = Pool(8)
print(len(imgurllist))
print(len(titlelist))
job = [(imgurllist[i], titlelist[i]) for i in range(len(imgurllist)]
pool.map(lambda args: auto_down(*args), job)
pool.join()
print("Done")
t2=time.time()
print("The totle time: ", t2-t1)

код изображения:

def auto_down(url,filename):
    socket.setdefaulttimeout(3)
    try:
        urllib.request.urlretrieve(url,filename)
    except Exception:
        count = 1
        while count <=5:
            try:
                urllib.request.urlretrieve(url,filename)
                break
            except socket.timeout:
                print("Reload")
                count +=1
        if count>5:
            print("Downloading pictures failed")

Когда вы запустите код, он будет работать до конца кода и печатать текущее время.Однако строка типа «Процесс завершен с кодом выхода 0» не печатается.Кажется, что процесс все еще работает и застрял.

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

Done
The totle time:  192.66301846504211
extern "Python": function gevent.libuv._corecffi.python_timer0_callback() called, but @ffi.def_extern() was not called in the current subinterpreter.  Returning 0.

Есть предложения, пожалуйста?Заранее спасибо.

...