![](/img/trans.png)
[英]Non-blocking http server , java nio , python tornado eventlet
[英]Multiple client using eventlet, need non-blocking IO code
下面是eventlet服務器的代碼。 我想做非阻塞IO。 為了測試非阻塞IO,我使用下面的代碼作為服務器。
import eventlet
from eventlet.green import socket
def fib(n):
if n == 1 or n == 2:
return 1
return (fib(n-1) + fib(n-2))
def handle_socket(reader, writer):
print ("client connected")
while True:
line = reader.readline()
if not line:
break
writer.write(line)
writer.flush()
n = line.rstrip()
print ("echoed", int(n))
print(fib(int(n)))
print ("disconnected")
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 6000))
server.listen(100)
print ("server listening on port 6000")
print('called me...')
while True:
sock, addr = server.accept()
eventlet.spawn(handle_socket, sock.makefile('r'), sock.makefile('w'))
要在客戶端進行測試,(在Windows上),執行以下步驟,
telnet localhost 6000
35
要獲得第35個Fibonacci系列號碼,在我的筆記本電腦上需要大約15秒 。 與此同時,我打開另一個終端並輸入較小的斐波納契數,如5或6(需要2/3秒) 。 但是,在計算出第35個數字的輸出之后,此服務器代碼按順序運行,然后僅打印另一個較小的數字輸出。 是否有辦法使相同的代碼“並發”或“並行”。
您最好的選擇是在單獨的OS線程中運行阻塞代碼。 Eventlet在eventlet.tpool
[1]中內置了線程池。 單個函數調用的簡單API:
result = eventlet.tpool.execute(fib, int(n))
[1] http://eventlet.net/doc/threading.html#tpool-simple-thread-pool
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.