1

私が関数を持っているとしましょう:

from time import sleep

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

そしてそれをforループで呼び出します

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

合計で印刷に10秒しかかからないようにこれを設定するにはどうすればよいですか。

$ 0123456789

100秒かかる代わりに。それが役に立ったら、私はあなたが提供した情報を使って非同期のウェブスクレイピングを行うつもりです。つまり、訪問したいサイトのリストがありますが、それぞれが完了するのを待つのではなく、同時に訪問したいと思います。

4

4 に答える 4

2

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)
于 2012-07-12T22:16:10.043 に答える
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)

より柔軟なソリューションについては、Celeryに目を向けることもお勧めします。

于 2012-07-12T18:42:42.140 に答える
1

スクレイピーなフレームワークを見てください。これは特にウェブスクレイピングを目的としており、非常に優れています。これは非同期であり、ツイストフレームワークに基づいて構築されています。

http://scrapy.org/

于 2012-07-12T18:54:08.460 に答える
0

念のため、これがサンプルスニペットにグリーンスレッドを適用する正確な方法です。

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
于 2013-06-30T10:52:44.523 に答える