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.1 替换 0.001。

于 2012-11-23T11:45:02.933 回答