Я бы сказал, что здесь есть на что обратить внимание:
raw_input
не пропатчен eventlet
, поэтому его вызовы блокируются
threading
исправлено eventlet
, поэтому потоки действуют как сопрограммы
Одним из способов обойти это было бы избежать исправления threading
, чтобы потоки были реальными потоками. Для этого вам просто нужно заменить:
eventlet.monkey_patch()
с:
eventlet.monkey_patch(os=True,
select=True,
socket=True,
thread=False,
time=True)
Обратите внимание, что когда thread
равно True
, исправляются следующие модули: thread
, threading
, Queue
.
Редактировать: Если вы хотите исправить threading
и иметь асинхронный raw_input
, тогда я предлагаю следующую реализацию:
def raw_input(message):
sys.stdout.write(message)
select.select([sys.stdin], [], [])
return sys.stdin.readline()
Это будет опросить sys.stdin
, чтобы проверить, готова ли она к чтению. Если это не так, он передаст управление eventlet для выполнения другой сопрограммы.