Сотрудничая 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()
Другие вопросы по тегам