Ярмарка семафор в питоне - PullRequest
       13

Ярмарка семафор в питоне

6 голосов
/ 17 ноября 2011

Возможно ли иметь справедливый семафор в python, который гарантирует, что блокирующие потоки разблокированы в порядке, который они вызывают acquire()?

Ответы [ 2 ]

6 голосов
/ 17 ноября 2011

Возможно, вам придется построить один из других движущихся частей.Например, создайте Queue.Queue(), для которого каждый слушатель публикует совершенно новый Event(), который он затем ожидает.Когда пришло время пробудить один из ожидающих потоков, вытолкните элемент в очереди, который ожидал дольше всего - это будет один из этих объектов события, - и освободите поток через event.set().

Очевидно, что вы также можете использовать семафор для каждого процесса ожидания, но мне нравится семантика Event, поскольку это может произойти только один раз, в то время как семафор имеет семантику, что его значение может поддерживать множество ожидающих потоков.

Чтобы настроить систему:

import Queue
big_queue = Queue.Queue()

Затем подождать:

import threading
myevent = threading.Event()
big_queue.put(myevent)
myevent.wait()

И освободить один из ожидающих потоков:

event = big_queue.get()
event.set()

ПолагаюСлабым местом этого подхода является то, что поток, выполняющий набор / выпуск, должен ждать появления ожидающего потока, тогда как настоящий семафор позволил бы продолжить несколько выпусков, даже если никто еще не ждал?

0 голосов
/ 17 ноября 2011

Поскольку Брэндон решил вопрос «честного семафора», возможно, было бы полезно взглянуть на связанную проблему барьеров, точки ожидания для потоков, которые должны быть достигнуты и затем освобождены одновременно: http://docs.python.org/py3k/whatsnew/3.2.html#threading

...