理解Python中的异步/多处理

2024-09-28 22:21:32 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个函数:

from time import sleep

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

然后我在for循环中调用它

^{pr2}$

如何设置此项以便只需10秒即可打印出:

$ 0123456789

而不是花100秒。如果有帮助的话,我将使用您提供的信息来执行异步web抓取。i、 我有一个我想访问的网站列表,但我想同时访问它们,而不是等待每个网站完成。在


Tags: 函数fromimportweb信息number列表for
3条回答

尝试使用Eventlet-文档中的first example演示了如何实现同步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框架。它是专门为网页抓取而设计的,非常好。它是异步的,构建在twisted框架上。在

{a1}

相关问题 更多 >