2013-09-24 3 views
0

В моем проекте используется eventlet, и теперь я должен асинхронно читать и записывать в файл (на самом деле это устройство). Я попробовал eventlet.tpool.execute() для запуска потока чтения, но он блокирует основной цикл.Совместное использование eventlet с системными вызовами

Мой вопрос: как запустить поток чтения одновременно с потоком событий? Возможно ли, чтобы эти два потока сообщались в некотором роде?

Быстрый эскиз:

def functionB(): 
    while True: 
    data = readFile() 
    doSomethingWith(data) 

def functionA(): 
    doSomething() 
    tpool.execute(functionB) 
    doSomethingElse() 

Тогда doSomethingElse() никогда не вызывается.

+0

могли бы вы предоставить более подробную информацию о «блоках основной цикл» часть? Кроме того, минимальный код воспроизведения будет очень полезен. – temoto

+0

@temoto Добавил быстрый эскиз, надеюсь, вы поймете, что я имею в виду. –

ответ

0

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() 
+0

Точно, но 'tpool' предположил, что это пул потоков? Итак, что мне делать, чтобы 'tpool.execute()' NOT блокировать последующие вызовы? –

+0

Элемент пула означает, что есть несколько потоков, доступных для работы одновременно, то есть вы можете запускать 'tpool.execute' из нескольких зеленых потоков, и они будут выполнять не более N (размер пула) одновременных заданий. Пул имеет два ключевых свойства: повторное использование ранее инициализированного ресурса и ограничение количества создаваемых ресурсов. В этом контексте ресурс является потоком ОС. – temoto

+0

Если вы хотите выполнить одну вещь в фоновом режиме, вам не нужен пул потоков. Просто запустите 'threading.Thread' (при условии, что вы не использовали потоки для обезьян). – temoto

Смежные вопросы