多个客户端使用eventlet,需要非阻塞IO代码

时间:2016-12-25 15:08:22

标签: python eventlet

以下是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系列号码,在我的笔记本电脑上需要 15secs 。同时,我打开另一个终端并输入较小的斐波纳契数,如 5或6(需要2/3秒)。但是,在计算出第35个数字的输出之后,此服务器代码按顺序运行,然后仅打印另一个较小的数字输出。是否有办法制作相同的代码"并发"或者" parallelism"。

1 个答案:

答案 0 :(得分:0)

您最好的选择是在单独的OS线程中运行阻止代码。 Eventlet在eventlet.tpool [1]中内置了线程池。单个函数调用的简单API:

result = eventlet.tpool.execute(fib, int(n))

[1] http://eventlet.net/doc/threading.html#tpool-simple-thread-pool