2016-12-25 12 views
1

Ниже приведен код сервера eventlet. Я хочу сделать Non-blocking IO. Чтобы проверить неблокирующий IO, я использовал ниже код в качестве сервера.Множественный клиент, использующий eventlet, нуждается в неблокирующем 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')) 

Для проверки на стороне клиента (на окнах), сделал следующие шаги,

telnet localhost 6000 
35 

Чтобы получить 35-й номер серии Фибоначчи, на моем ноутбуке она занимает около 15secs. Между тем, я открываю другой терминал и вводят меньшее число фибоначчи, например 5 или 6 (что занимает 2/3 секунды). Но этот код сервера работает последовательно, после того как вычислен вывод 35-го числа, будет напечатан только другой вывод меньшего числа. Есть ли способ сделать тот же код «параллельным» или «параллелизмом».

ответ

0

Ваш лучший вариант - запустить блокирующий код в отдельном потоке ОС. Eventlet имеет встроенный пул потоков в eventlet.tpool [1]. Более простой интерфейс для вызова функции:

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

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