Python: способы синхронизации задач трио и обычных потоков - PullRequest
0 голосов
/ 23 сентября 2018

Я нахожусь в ситуации, когда мне нужно синхронизировать задачи Trio с потоками Python.В настоящее время я использую threading.Lock объекты, которые задачи Трио должны получить с помощью trio.run_sync_in_worker_thread(lock.acquire).

. Я думаю, что также должно быть возможно использовать trio. Lock блокировки, и потоки получат их с помощью * 1006.*.

Обладает ли одно из этих решений преимуществами перед другим?

В принципе можно ли добиться большего успеха, чем это?Например, чтобы реализовать «родной» метод трио, который ожидает threading.Lock без необходимости отдельного рабочего потока, или есть фундаментальные причины, почему это требуется?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Ответ Матиаса превосходен.Чтобы добавить: есть одно теоретическое преимущество использования trio.Lock, которое заключается в том, что, по крайней мере, вызовы на стороне трио будут поддерживать отмену.Однако в настоящее время существует и серьезное практическое препятствие, которое заключается в том, что в настоящее время использование BlockingTrioPortal для вызова lock.acquire и lock.release не работает :-(. См. эту проблему, которую я только что подал длядетали. Так что, пока это не исправлено, вам придется использовать threading.Lock и run_sync_in_worker_thread. Однако после исправления я по умолчанию буду использовать trio.Lock для отмены.

РЕДАКТИРОВАТЬ: дальшеподумал, я вспомнил, что у трио уже есть версия Lock, которая работает с BlockingTrioPortal, это просто неясно: trio.Semaphore(1, max_value=1). Мы должны все же исправить общий случай, но в то же время это может быть полезнознать о.

0 голосов
/ 23 сентября 2018

Оба метода хороши.Я бы рекомендовал использовать метод, который вызывает меньше работы, то есть, если внешний поток получает блокировку десять раз за задачу Трио один раз, тогда используйте блокировку потока, и наоборот.

A threading.Lock всегда блокирует поток, пытающийся получить его, поэтому для его извлечения из Trio требуется либо отдельный поток (что ваш первый метод уже делает в любом случае), либо держатель замка должен подать сигнал задаче Trio, чтоон снял блокировку (что делает ваш второй метод в любом случае), поэтому нет явного преимущества для реализации решения более низкого уровня.

...