2014-07-13 6 views
1

**** 안녕하세요, 모두Eventlet의 생성이 작동하지 않습니다. 이상한

저는 웹 크롤러를 구현하기 위해 eventlet을 사용하고 있습니다. pool.imap는 작품

무슨 일이 있었는지

을한다, 내 코드는이

import eventlet 


urls = [ 
    "http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B", 
    "http://www.google.com.hk", 
    "http://www.baidu.com", 
] 



def fetch(url): 
    print('entering fetch') 
    body=urllib2.urlopen(url).read() 
    print('body') 


pool = eventlet.GreenPool(100) 
for url in urls: 
    pool.spawn(fetch,url) 
    time.sleep(10) 

비슷하지만 아무것도 출력하지하고 BTW 모든

에서 실행되지 않습니다 가져올 것 같다?

내가 원하는 것은 다음과 같습니다. URL이 곧바로 들어옵니다. 하나씩. 이처럼

While(True): 
    url=getOneUrl() #get one url streamly 
    pool.spawn(fetch,url) #fetch the url 

도 작동하지 않습니다. eventlet 구현에 따라 사전에

덕분에 ....

답변

0

의 pool.imap 코드는 풀 마무리 작업의 모든 greenthreads 때까지 기다려야하지만, pool.spawn은하지 않습니다 즉시 종료됩니다.

스크립트가 끝날 때 기다리거나 잠자는 것을 추가 할 수 있습니다. 그러면 그 산란 된 포도주가 당신의 기능을 실행할 것입니다. 'pool.imap 바디 (URL을 페치)에 대한'는 pool.imap 호출 결과를 반복에

pool.waitall() 

또는 실제로

eventlet.sleep(10) 

. pool.imap의 호출은 대기 함수를 호출하지 않지만 반복은 수행합니다.

결과를 반복하지 않고 시도해보십시오. 반복이 없으면 즉시 pool.spawn으로 끝납니다.

pool = eventlet.GreenPool(100) 
pool.imap(fetch, urls) 

자세한 내용은 greenpool.py의 코드를 확인하십시오.


모든 녹색 스레드에 대해 하나의 스레드 만 실행 중입니다. 모든 녹색 스레드에서 이것을 시도하면 고유 한 스레드 ID를 얻게됩니다.

print greenthread.getcurrent(), threading.current_thread() 

eventlet.sleep없이 반복하면 스레드가 항상 차단됩니다. 다른 녹색 스레드는 예약 할 기회가 없습니다. 문제를 해결할 수있는 한 가지 해결책은 while 루프에서 spawn을 호출 한 후 eventlet.sleep을 호출하는 것입니다.

+0

덕분에 다운로드해야하는 URL이 streamly 오는 것입니다. ... 즉, 하나씩 순식간에 (True) : url = getOneUrl; fetch (url) 스폰 또는 imap을 통해 구현하는 방법? 덕분에 많이 – user2793707

+0

대단히 감사합니다. 그것을 얻을 – user2793707

+0

많은 감사합니다. 당신은 너무 nice.i 당신이 당신의 포스터를 다시하고 다시 찾았다는 것을 발견했습니다. 정말 감사합니다. 감사합니다. – user2793707

0

당신은 Eventlet를 사용하여 내 크롤러를 보라 할 수 있습니다 : 원숭이 패치없이

  • time.sleep() :

    https://github.com/temoto/heroshi/blob/3b5e273783de9ea4b24cbcb0bf01a5025f653b93/heroshi/worker/Crawler.py 당신은 위안에서 좋은 반응을 받았다, 나는 단지 두 가지를 추가하고 싶습니다 전체 프로세스를 차단하고 URL을 가져 오지 않습니다. 시작시 eventlet.monkey_patch()을 실행하거나 eventlet.sleep()을 사용하십시오.

  • 스트리밍 URL에서 다시 Heroshi 마스터의 io-worker를 사용하는 것이 좋습니다.stdin에서 URL을 읽고 크롤링하고 결과를 stdout에 쓰는 독립 프로그램입니다. 당신이 정말로 그것을 위해 Eventlet을 사용할 경우, 사용 큐를 공유, 그것은 작동합니다 : 당신의 reply.But 내 문제에 대한 매우


pool = eventlet.GreenPool(100) 
urls = eventlet.queue.Queue() 
results = eventlet.queue.Queue() 

urls.put('http://seed-url-1') 
urls.put('http://seed-url-2') 
# ... 


def fetch(url): 
    # ... 
    results.put(...) 


def crawl(): 
    while True: # this is not C/Java, you don't need parens 
    url = urls.get() 
    pool.spawn(fetch, url) 


def parse(): 
    while True: 
    result = results.get() 
    # ... 
    urls.put(new_url_from_page) 


eventlet.spawn(crawl) 
eventlet.spawn(parse) 
+0

고마워. 많이 해. – user2793707

관련 문제