gpt4 book ai didi

python - Eventlet 的生成不起作用。这么奇怪

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:48 25 4
gpt4 key购买 nike

****大家好

我正在使用 eventlet 来实现网络爬虫。我的代码是这样的

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)

但它没有输出任何内容,而且 fetch 似乎根本没有运行

顺便说一句,pool.imap 确实有效

发生了什么?

我想要做的是:网址源源不断地出现,即逐个。就像这样

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

但它也不起作用。

提前致谢......

最佳答案

根据 eventlet 实现,pool.imap 代码将等待池中的所有 greenthreads 完成工作,但 pool.spawn 不会并立即结束。

您可以尝试在脚本末尾附加一些等待或 sleep 。然后那些生成的绿色线程将执行您的函数。

pool.waitall()

eventlet.sleep(10)

实际上,在“for body in pool.imap(fetch, urls)”中,它调用 pool.imap 并迭代结果。 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。

关于python - Eventlet 的生成不起作用。这么奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24722534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com