1
python3에서 gevent를 사용하여 웹 페이지를 다운로드하는 스파이더 프로그램을 작성하고 싶습니다. 여기 내 코드입니다 :python3 urllib.request는 gevent에서 영원히 차단 될 것입니다
import gevent
import gevent.pool
import gevent.monkey
import urllib.request
gevent.monkey.patch_all()
def download(url):
return urllib.request.urlopen(url).read(10)
urls = ['http://www.google.com'] * 100
jobs = [gevent.spawn(download, url) for url in urls]
gevent.joinall(jobs)
하지만 그것을 실행할 때 오류가 :
Traceback (most recent call last):
File "/usr/local/lib/python3.4/dist-packages/gevent/greenlet.py", line 340, in run
result = self._run(*self.args, **self.kwargs)
File "e.py", line 8, in download
return urllib.request.urlopen(url).read(10)
File "/usr/lib/python3.4/urllib/request.py", line 153, in urlopen
return opener.open(url, data, timeout)
......
return greenlet.switch(self)
gevent.hub.LoopExit: This operation would block forever
<Greenlet at 0x7f4b33d2fdf0: download('http://www.google.com')> failed with LoopExit
......
urllib.request 블록, 프로그램이 작동하지 않을 수 있습니다 것으로 보인다. 그것을 해결하는 방법?
(http://docs.python-requests.org/en/latest/)에 대한 'requests' 사용을 고려해야한다. 직선적 인 urllib보다 고통스럽지 않고 Python 3을 지원하며 monkeypatching이 충분하지 않은 경우 grequests (https://github.com/kennethreitz/grequests)를 통해 "기본"gevent 지원을 제공합니다. –