可以说,我有一个函数:
from time import sleep
def doSomethingThatTakesALongTime(number):
print number
sleep(10)
然后我把它在一个for循环
for number in range(10):
doSomethingThatTakesALongTime(number)
我如何可以设置此,以便它仅需要10秒TOTAL打印出来:
$ 0123456789
而不是采取100秒。 如果有帮助,我会使用你提供做异步Web刮的信息。 即我有我想要访问的网站的列表,但我想同时看望他们,而不是等待每一个来完成。
看看scrapy框架。 它特别适用于网络刮是非常好的。 这是asynchronus和建立在扭曲的框架。
http://scrapy.org/
尝试使用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)
我也可以建议把目光投向芹菜更灵活的解决方案。
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)
为以防万一,这是应用绿色线程您的示例代码片段的确切方式:
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