Найти - Пользователи
Полная версия: threadpool велосипед с помощью корутинов.
Начало » Python для экспертов » threadpool велосипед с помощью корутинов.
1
plusplus
В своё время понравилась эта реализация threadpool-а

Довольно много раз приходилось её использовать и за это время было выявлено одно неудобство:
в worker нельзя писать не thread-safe код, а иногда бывает надо, например, сделать какой-то запрос к базе данных. Приходилось ставить локеры. А недавно, прочитал про корутины и увидел инлайн колбэки в twisted и подумалось: “А что если, что подобное организовать и здесь?” То есть worker передает функцию, которую нужно выполнить, в основной поток, а затем результат её выполнения возвращается обратно в worker:
def worker(arg):
    do_something_thread_safe()
    def do_something_not_thread_safe():
        pass
    result = yield do_something_not_thread_safe
    do_something_thread_safe(result)
    
Собственно, вопрос, нужно ли всё это? Есть в этом какое-то преимущество, по сравнению с локерами?
o7412369815963
plusplus
thread-safe код, а иногда бывает надо, например, сделать какой-то запрос к базе данных.
Можно использовать thread-safe либы для БД, они наверно чаще такие и есть.

plusplus
То есть worker передает функцию, которую нужно выполнить, в основной поток, а затем результат её выполнения возвращается обратно в worker:
Идея интересная, но я думаю “игра не стоит свеч”. Для передачи в другой поток, yield не поможет, нужно делать “акторы” с передачей данных через какие-нибудь queue.

plusplus
прочитал про корутины
По идее, то что на yield - это генераторы, корутины - это на гринлетах. Выполняются в одном потоке, и (все) операции - неблокирующие.
plusplus
o7412369815963
Идея интересная, но я думаю “игра не стоит свеч”. Для передачи в другой поток, yield не поможет, нужно делать “акторы” с передачей данных через какие-нибудь queue.

Ну вот по ссылке что я дал как раз так и организовано это. Результаты складываются в queue из которой потом yield-ятся. Я же хочу чутка модернизировать этот код. По сути вопрос состоит в следующем: стоит ли вместо этого кода:
def worker(arg):
    do_something_thread_safe()
    # self.__mutex - это threading.Lock
    with self.__mutex:
        result = do_something_not_thread_safe():
    do_something_thread_safe(result)

поправить данный модуль так, чтобы можно было писать так как я написал в первом посте?
reclosedev
Знаю случай, когда только локами не обойтись - это GUI библиотеки. Там большая часть обновлений GUI элементов должна проходить в основном потоке.

Честно говоря, не представляю как вы хотите передавать управление именно в основной поток, получается, что должна быть очередь или цикл событий. Но в обычной программе их нет, они блокируют.

Я с корутинами делал похожее, только наоборот, то что yield'илось выполнялось в отдельном потоке/процессе/гринлете (http://python.su/forum/topic/21180/).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB