理解您需要將「重負載」處理分離到線程池[1]中很重要。
在gevent線程中發生的每個處理(並且每個本地線程都可以有一個gevent HUB)必須只關注處理網絡請求和發送響應。
from gevent import spawn, run
from gevent.threadpool import ThreadPool
from time import sleep as heavy_load, time as now
class Globals:
jobs = 4
index = 0
greenlets = []
pool = ThreadPool(3) # change size of the pool appropriately
start = now()
def get_uername():
heavy_load(0.1)
Globals.index += 1
return "Alex {0}".format(Globals.index)
def do_something_else(username):
heavy_load(2.0)
print "Heavy job done for", username, now() - start
def views1():
"a request comes to views1 and it first returns the username"
username = get_uername()
## There is some heavy job separate done by do_something_else right after views1 is done
Globals.greenlets.append(
Globals.pool.spawn(do_something_else, username)
)
# return username
print "Returned requested username", username, now() - start
if __name__ == '__main__':
## simulate clients
for job_index in xrange(Globals.jobs):
Globals.greenlets.append(spawn(views1))
## wait for all tasks to complete
# for greenlet in Globals.greenlets:
# try:
# greenlet.join()
# except AttributeError, e:
# greenlet.get()
run()
print "Test done", now() - start
這是測試的輸出:
python threadpool_test.py
Returned requested username Alex 1 0.101000070572
Returned requested username Alex 2 0.201999902725
Returned requested username Alex 3 0.302999973297
Returned requested username Alex 4 0.40299987793
Heavy job done for Alex 1 2.10100007057
Heavy job done for Alex 2 2.2009999752
Heavy job done for Alex 3 2.3029999733
Heavy job done for Alex 4 4.10299992561
Test done 4.10500001907
注意如何所有的請求都完成了第一和並行do_something_else
任務是在3
當不使用線程池的大小批量完成每個請求需要額外的時間do_something_else
引入,這不是asynchronous programming
gevent必須提供。在這種情況下,輸出應該是這樣的:
Heavy job done for Alex 1 2.10100007057
Returned requested username Alex 1 2.10100007057
Heavy job done for Alex 2 4.2009999752
Returned requested username Alex 2 4.20199990273
Heavy job done for Alex 3 6.30200004578
Returned requested username Alex 3 6.3029999733
Heavy job done for Alex 4 8.40299987793
Returned requested username Alex 4 8.40400004387
Test done 8.40400004387
注意如何當異步處理的第四請求完成亞特8.4秒代替0.4秒。
[1] http://code.google.com/p/gevent/source/browse/examples/threadpool.py
重要的建議:採取一些額外的時間,使您的問題的獨立的測試,這將使問題清晰,你更專業。 – Alex 2012-07-23 10:17:45