Форум сайта python.su
В своё время понравилась эта реализация 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)
Офлайн
plusplusМожно использовать thread-safe либы для БД, они наверно чаще такие и есть.
thread-safe код, а иногда бывает надо, например, сделать какой-то запрос к базе данных.
plusplusИдея интересная, но я думаю “игра не стоит свеч”. Для передачи в другой поток, yield не поможет, нужно делать “акторы” с передачей данных через какие-нибудь queue.
То есть worker передает функцию, которую нужно выполнить, в основной поток, а затем результат её выполнения возвращается обратно в worker:
plusplusПо идее, то что на yield - это генераторы, корутины - это на гринлетах. Выполняются в одном потоке, и (все) операции - неблокирующие.
прочитал про корутины
Офлайн
o7412369815963
Идея интересная, но я думаю “игра не стоит свеч”. Для передачи в другой поток, yield не поможет, нужно делать “акторы” с передачей данных через какие-нибудь queue.
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)
Офлайн
Знаю случай, когда только локами не обойтись - это GUI библиотеки. Там большая часть обновлений GUI элементов должна проходить в основном потоке.
Честно говоря, не представляю как вы хотите передавать управление именно в основной поток, получается, что должна быть очередь или цикл событий. Но в обычной программе их нет, они блокируют.
Я с корутинами делал похожее, только наоборот, то что yield'илось выполнялось в отдельном потоке/процессе/гринлете (http://python.su/forum/topic/21180/).
Офлайн