Сотрудничая Eventlet с системными вызовами
Мой проект использует eventlet
и теперь я должен асинхронно читать и записывать в файл (на самом деле устройство). Я старался eventlet.tpool.execute()
запустить поток чтения, но он блокирует основной цикл.
У меня вопрос, как запустить поток чтения одновременно с потоком eventlet? Возможно ли взаимодействие этих двух потоков каким-либо образом?
Быстрый набросок:
def functionB():
while True:
data = readFile()
doSomethingWith(data)
def functionA():
doSomething()
tpool.execute(functionB)
doSomethingElse()
затем doSomethingElse()
никогда не называется.
1 ответ
tpool.execute
не должен возвращаться до functionB
закончился. Твой не заканчивается, так doSomethingElse()
не предполагается выполнить.
Другими словами, tpool.execute
это не тип огня и забыть. Он порождает функцию в потоке ОС и синхронизирует звонящего. Что на самом деле очень полезно.
Если вы хотите начать новый вечно работающий поток, просто сделайте это с обычным Python threading.Thread
,
Типичный вариант использования для tpool.execute
:
def main():
f = tpool.execute(open, ...)
while True:
chunk = tpool.execute(f.read, size)
# process chunk
tpool.execute(f.close)
Вы можете попробовать следующий код, чтобы решить вашу проблему:
def functionB():
while True:
data = tpool.execute(readFile) # just readFile -> tpool.execute
doSomethingWith(data)
def functionA():
doSomething()
eventlet.spawn_n(functionB) # tpool.execute -> spawn_n
doSomethingElse()