Подтвердить что ты не робот

Зеленые потоки и поток в Python

Как Википедические состояния:

Зеленые потоки эмулируют многопоточные среды, не полагаясь на какие-либо возможности ОС, и управляются ими в пространстве пользователя, а не в пространстве ядра, что позволяет им работать в средах, которые не поддерживают встроенный поток.

Нити Python реализованы как pthreads (kernel threads), и из-за блокировки глобального интерпретатора (GIL) процесс Python запускает только один поток за раз.

[ Вопрос] Но в случае Green-threads (или так называемой зеленой или талисманы),

  • Влияет ли на него GIL на них? Может ли быть более одной зелёной работает одновременно?
  • Каковы подводные камни использования зеленых или таблеток?
  • Если я использую зелья, сколько из них может обрабатывать процесс? (Мне интересно, потому что в одном процессе вы можете открывать темы до ulimit (-s, -v), установленный в вашей системе * ix.)

Мне нужно немного понять, и это поможет, если кто-то сможет поделиться своим опытом или вести меня по правильному пути.

4b9b3361

Ответ 1

Вы можете думать о зеленых, более похожих на кооперативные потоки. Это означает, что нет планировщика, предварительно упреждающего переключение между вашими нитями в любой момент - вместо этого ваши зеленые поля добровольно/явно отказываются контролировать друг друга в определенных точках вашего кода.

Влияет ли на них GIL? Может ли быть более одной очереди в то время?

За один раз запускается только один путь кода - преимущество в том, что у вас есть конечный контроль над тем, что есть.

Каковы подводные камни использования зеленых или талией?

Вам нужно быть более осторожным - плохо написанная зелень не даст контроля над другими зелени. С другой стороны, поскольку вы знаете, когда зеленая коммутатор контекста, вы можете уйти, не создавая блокировки для общих структур данных.

Если я использую зелья, сколько из них может обрабатывать процесс? (Мне интересно, потому что в одном процессе вы можете открывать потоки до предела umask, установленного в вашей системе * ix.)

С регулярными потоками, чем больше у вас будет больше накладных расходов планировщика. Также регулярные потоки по-прежнему имеют относительно высокие накладные расходы контекста. У зеленых нет этих накладных расходов, связанных с ними. Из документации :

Большинство серверов ограничивают размер своих рабочих пулов относительно низким количество параллельных потоков из-за высоких накладных расходов, связанных с переключение между ними и создание новых потоков. Хотя потоки дешевы по сравнению с процессами (forks), они по-прежнему дороги для создания каждое новое соединение.

Модуль gevent добавляет зелья в микс. Гринлеты ведут себя аналогично к традиционным потокам, но очень дешево создавать. Основанный на gevent сервер может порождать тысячи зеленых (по одному для каждого соединения) с почти нет накладных расходов. Блокировка отдельных зеленых зон не влияет на серверы могут принимать новые запросы. Количество одновременных соединения практически не ограничены.

Здесь также можно прочитать здесь, если вам интересно: http://sdiehl.github.io/gevent-tutorial/

Ответ 2

Я предполагаю, что вы говорите о зеленых остриях /gevent

1) Может работать только одна зелень

2) Это совместная многопоточность, что означает, что если зелень застревает в бесконечном цикле, вся ваша программа застревает, обычно зелья планируются либо явно, либо во время ввода/вывода

3) Гораздо больше, чем потоки, это зависит от объема доступной оперативной памяти.