繁体   English   中英

了解Python中的异步/多处理

[英]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抓取,非常好。 它是异步的,基于扭曲的框架构建。

http://scrapy.org/

以防万一,这是将绿色线程应用于示例代码段的确切方法:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM