Может ли асинхронный код безопасно вызывать нативные библиотеки, использующие pthread? - PullRequest
1 голос
/ 30 апреля 2019

Я рассматриваю возможность использования asyncio в проекте.В проекте используются сторонние библиотеки, которые будут создавать pthreads, а также перезванивать в мой код.

Изменение проекта для использования asyncio потребует несколько больших переписываний, поэтому я не могу просто «попробовать», яМне нужна некоторая информация заранее.

Безопасно ли использовать asyncio и цикл обработки событий со сторонними библиотеками, которые используют pthreads и обратные вызовы в вашем коде?

1 Ответ

1 голос
/ 30 апреля 2019

Внутри сопрограммы asyncio вы можете использовать любую функцию, если она работает относительно быстро (<0,05 сек.), В противном случае вы рискуете заблокировать цикл обработки событий и получить значительное снижение производительности. </p>

Если функция работает относительно медленно, онавсе еще может использоваться внутри сопрограммы asycnio без побочных эффектов, но только внутри executor .

Если функция возвращается быстро и позже вызывает обратный вызов - это хорошая ситуация.Такая функция / обратный вызов может быть приведена к ожидаемому красивому asyncio с помощью asyncio.Future .

Также обратите внимание, что многие объекты asyncio по умолчанию не являются потокобезопасными.


Короче говоря, я не вижу причины, по которой asyncio нельзя безопасно использовать со сторонней библиотекой, которая использует потоки, если все реализовано правильно.

Но прежде чем переписывать что-либо в большой кодовой базе, вам следуетточно знаю, , почему вам нужен asyncio и, имхо, есть некоторый опыт работы с ним на меньшей кодовой базе.

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

Оборачивание существующего кода для использования asyncio вместо перезаписи звучит как хорошая идея: вы можете сделать это итеративно и только для используемых вами частей.

...