了解异步/多处理在Python(Understanding Asynchronous/Multipr

2019-09-19 10:15发布

可以说,我有一个函数:

from time import sleep

def doSomethingThatTakesALongTime(number):
  print number
  sleep(10)

然后我把它在一个for循环

for number in range(10):
  doSomethingThatTakesALongTime(number)

我如何可以设置此,以便它仅需要10秒TOTAL打印出来:

$ 0123456789

而不是采取100秒。 如果有帮助,我会使用你提供做异步Web刮的信息。 即我有我想要访问的网站的列表,但我想同时看望他们,而不是等待每一个来完成。

Answer 1:

看看scrapy框架。 它特别适用于网络刮是非常好的。 这是asynchronus和建立在扭曲的框架。

http://scrapy.org/



Answer 2:

尝试使用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)

我也可以建议把目光投向芹菜更灵活的解决方案。



Answer 3:

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)


Answer 4:

为以防万一,这是应用绿色线程您的示例代码片段的确切方式:

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


文章来源: Understanding Asynchronous/Multiprocessing in Python