Несколько системных вызовов select () из одного потока в Python - PullRequest
0 голосов
/ 21 июля 2010

Я использую пару библиотек Python, и они обе используют системный вызов select (). Мне было интересно, было ли безопасно иметь два системных вызова select () внутри одного потока (при условии, что между ними нет общих дескрипторов)?

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Ну, в пределах одного потока у вас не может быть "двух системных вызовов select ()", потому что первый вызов должен закончиться, прежде чем вы сможете начать второй вызов.Но да, это совершенно безопасно, даже если они do совместно используют дескрипторы: оба вызова создают новые объекты для возврата, нет повторного использования переменных, которые могли бы повлиять на них (как это может быть с static переменными в C.)

Даже если бы у вас было несколько потоков, это было бы хорошо, поскольку модуль select осторожно удерживает GIL до фактического вызова select.В этом случае вы должны избегать совместного использования дескрипторов.

0 голосов
/ 21 июля 2010

Мне кажется маловероятным, что это будет работать хорошо, но это зависит от библиотек и от того, что вам нужно от них делать.Некоторые мысли:

  • Библиотеки могут предоставлять API для открытия цикла выбора, либо позволяя вам подключиться к их циклу выбора с помощью собственных файловых дескрипторов, либо предоставляя API, которые возвращают свои собственные селекторы (такчто вы можете подключить их в свой собственный цикл выбора), или оба.Я хотел бы выяснить, есть ли в этих библиотеках такие API.

Если предположить, что таких API не существует, то:

  • Если одна из библиотек реализует цикл выборатак что он никогда не возвращается из цикла, тогда вам совершенно не повезло - вы никогда не сможете перейти один цикл выбора этой библиотеки в цикл выбора другой библиотеки.

  • Если одна из библиотек вызовет select() без значения времени ожидания, вы, вероятно, не получите хороших результатов.Без тайм-аута библиотека может (и, вероятно, будет) вызывать бесконечную блокировку потока.

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

  • Библиотеки могут предоставлять API, которые вы можете использовать для отправки сообщений, которые они выбираютв пределах цикла select.Если они это сделают, то это делает многопоточность намного проще в реализации.Если они этого не делают, это может сделать даже однопоточность намного сложнее в управлении.(Вы уверены, что многопоточность не подходит?)

  • Вы уверены, что ваш выбор библиотек подходит для вашего приложения?Если это пользовательские библиотеки (или библиотеки с открытым исходным кодом), можно ли изменить их, чтобы сделать их более удобными для выбора?

...