1

geventに関するチュートリアルを読んでいます。これは、同期および非同期の場合のデモンストレーション用のサンプルコードを提供します。

import gevent
import random

def task(pid):
    """
    Some non-deterministic task
    """
    gevent.sleep(random.randint(0,2)*0.001)
    print('Task', pid, 'done')

def synchronous():
    for i in range(1,10):
        task(i)

def asynchronous():
    threads = [gevent.spawn(task, i) for i in xrange(1000)]
    gevent.joinall(threads)

この記事では、「非同期の場合の実行順序は基本的にランダムであり、非同期の場合の合計実行時間は同期の場合よりもはるかに短い」と説明しています。そこで、タイムモジュールを使用してテストしました。

print('Synchronous:')
start1 = time.clock()
synchronous()
end1 = time.clock()
print "%.2gs" % (end1-start1)

print('Asynchronous:')
start2 = time.clock()
asynchronous()
end2 = time.clock()
print "%.2gs" % (end2-start2)

ただし、「非同期」によって実行される時間は「同期」よりもはるかに長くなります。

ubuntu@ip:/tmp$ python gevent_as.py
Synchronous:
0.32s
Asynchronous:
0.64s
ubuntu@ip:/tmp$ python gevent_as.py
Synchronous:
0.3s
Asynchronous:
0.61s

テストプログラムの何が問題になっているのか知りたいですか?ありがとう。

4

2 に答える 2

1

これはtime.clock()の問題であり、 ubuntuでは正しく機能しません。詳細については、リンクを参照してください:Python --time.clock()vs. time.time()-精度?

テストプログラムを変更しました:

print('Synchronous:')
start1 = time.time()
synchronous()
end1 = time.time()
print "%.2gs" % (end1-start1)

print('Asynchronous:')
start2 = time.time()
asynchronous()
end2 = time.time()
print "%.2gs" % (end2-start2)

その場合、「非同期」のテスト速度は「同期」よりもはるかに高速です。

ubuntu@ip:/tmp$ python gevent_as.py
Synchronous:
1.1s
Asynchronous:
0.057s
于 2012-11-23T16:29:41.700 に答える
0

おそらく、睡眠は非常に小さく、オーバーヘッドが問題になります。0.001を0.1に置き換えてみてください。

于 2012-11-23T11:45:02.933 に答える