Найти - Пользователи
Полная версия: c extension for python
Начало » Python для экспертов » c extension for python
1
devalentino
Добрый вечер.

У меня вопрос по поводу сишных расширений. Есть проект и нужно выполнять паралельно сотни http запросов. Хочу сделать C extention и обрабатывать каждый запрос в отдельном потоке. В расширение можно передать функцию и вызвать ее когда какой-то из потоков выполнится. Мне не совсем ясно что будет с интерпритатором в момент когда я дерну еитоновский колбек. Приостановит ли интерпритатор свою работу и отработает мой колбек? Или расширение вызовет функцию в новом процессе?

Это все пишется к торнадо, то есть хочется чтобы колбеки в IOLoop попадали. Сталкивался ли кто-то из форумчан с подобным?
doza_and
Такие задачи лучше делать не отдельными потоками а асинхронными вызовами. Сишная функция будет выполняться в отдельном потоке. GIL на нее не влияет.
devalentino
doza_and
Такие задачи лучше делать не отдельными потоками а асинхронными вызовами. Сишная функция будет выполняться в отдельном потоке. GIL на нее не влияет.

Получается процесс приостановится на время выполнения сишной функции? Как с колбеками? Когда питоновская функция выполнится?

Если есть подробная статья на эту тему - буду очень признателен. На русском или английском. В официальной документации это описывается не достаточно подробно. Хотелось бы диаграмму потоков посмотреть или что-то такое.

Интересует именно интеграция между питоном и C. Асинхронные вызовы торнадо не интересуют.

Спасибо.
PooH
doza_and
Сишная функция будет выполняться в отдельном потоке. GIL на нее не влияет.
Разве при вызове питоновского колбека она не захватит GIL?
doza_and
PooH
Разве при вызове питоновского колбека она не захватит GIL?

конечно захватит
JOHN_16
devalentino
немножко около темы - GIL начинает тормозить выполнение кода в момент нагрузки ЦПУ. В случае сетевых запросов производительность упирается в подсистему ввода вывода. Например не так давно я делал нечто подобное. у меня была очередь из 65000 адресов которые нужно было http запросами опросить. Так вот у меня уперлось все в то что мне система не разрешила сделать более N потоков. Размер N уточню через 5 часов. Так вот, это при том что исполнитель был 1 процесс. если воспользоваться модулем multiprocessing то можно расширить количество открытых потоков, т.е. например каждый новый процесс будет порождать 100 потоков, 10 процессов уже 1000. Конечно же у системы есть некий предел количеству процессов и потоков, и еще и сокетов, но там думается мне бОльшие числа.
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