簡體   English   中英

多個客戶端使用eventlet,需要非阻塞IO代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM