[英]Understanding Asynchronous/Multiprocessing in Python
可以说我有一个功能:
from time import sleep
def doSomethingThatTakesALongTime(number):
print number
sleep(10)
然后在for循环中调用它
for number in range(10):
doSomethingThatTakesALongTime(number)
我该如何进行设置,以便只花10秒钟即可打印出来:
$ 0123456789
而不是花费100秒。 如果有帮助,我将使用您提供的信息进行异步Web抓取。 即,我有要访问的站点列表,但是我想同时访问它们,而不是等待每个站点完成。
尝试使用Eventlet-文档的第一个示例显示了如何实现同时URL提取:
urls = ["http://www.google.com/intl/en_ALL/images/logo.gif",
"https://wiki.secondlife.com/w/images/secondlife.jpg",
"http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif"]
import eventlet
from eventlet.green import urllib2
def fetch(url):
return urllib2.urlopen(url).read()
pool = eventlet.GreenPool()
for body in pool.imap(fetch, urls):
print "got body", len(body)
我也建议向Celery寻求更灵活的解决方案。
asyncoro支持异步并发编程。 它包括异步(非阻塞)套接字实现。 如果您的实现不需要urllib / httplib等(没有异步补全),则可以满足您的目的(并且易于使用,因为它与使用线程编程非常相似)。 您与asyncoro的上述问题:
import asyncoro
def do_something(number, coro=None):
print number
yield coro.sleep(10)
for number in range(10):
asyncoro.Coro(do_something, number)
看一下scrapy框架。 它专门用于Web抓取,非常好。 它是异步的,基于扭曲的框架构建。
以防万一,这是将绿色线程应用于示例代码段的确切方法:
from eventlet.green.time import sleep
from eventlet.greenpool import GreenPool
def doSomethingThatTakesALongTime(number):
print number
sleep(10)
pool = GreenPool()
for number in range(100):
pool.spawn_n(doSomethingThatTakesALongTime, number)
import timeit
print timeit.timeit("pool.waitall()", "from __main__ import pool")
# yields : 10.9335260363
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.