Python

2014-04-30 3 views
8

'da bir engelleme, sıfır uzunluk kuyruğu oluşturmanın iyi bir yolu Java'da, depolama kapasitesine sahip olmayan bir kuyruk var, java.util.concurrent.SynchronousQueue. Değerleri koymaya/almaya çalışan ipler, başka bir evre, sırasıyla bir değer elde etmeye/koymaya çalışana kadar her zaman engellenir.Python

Python'da bunu yapmanın iyi yolları nelerdir? Yani Değerleri bir veya daha fazla iş parçacığı kümesinden, her iki gruptaki bir iş parçacığına "ait" olan bir değere sahip olmayan bir veya daha fazla iş parçacığının başka bir kümesine geçirmenin bir yolunu istiyorum. Python'un queue.Queue uzunluğunun 0 olması için izin vermez, maksimum kapasite için pozitif olmayan bir değer belirtmek sınırsız bir sıra oluşturur.

cevap

2

Aşağıdakiler çıkmaz sokaklarda bir şehir olabilir, ancak aşağıdaki gibi bir şey olabilir mi?

class SynchronousQueue(object): 
    def __init__(self): 
     self.ready_to_get = Queue(1) 
     self.queue = Queue(1) 

    def get(self): 
     self.ready_to_get.put('ready', block=True) 
     return self.queue.get(block=True) 

    def put(self, item): 
     self.ready_to_get.get(block=True) 
     self.queue.put(item, block=True) 

Düzenli sırası, (alıcı atıcı bekliyor) ne istediğini yarısını destekler, bu yüzden denemek ve bir get başlamıştır kadar put bloke ederek ters uygulayabilir.

get() tamamladı kadar engelleme Queue.join() ve Queue.task_done() kullanabilirsiniz
+0

Sana sınırsız uzunluğu bu sıraları yapılmış ama daha verimli olabilir eğer davranışını değiştirir sanmıyorum: bunun anlamı ready_to_get.put() 'hiçbir zaman engelleyemedi (ancak queue.get() 'nin hala engelleyeceği gibi) ve aynı şekilde" queue.put() ", engellemedi, ancak siz bunu yapamazsınız. bir şey 'almaya' çalışıyordu. – Duncan

+0

İki alıcının sıraya alındığı durumu denemek ve hesaplamak istedim, ancak yalnızca bir yazar mevcut. Ama bence haklısın, yine de kapatalım. –

2

:

class SynchronousQueue(object): 

    def __init__(self): 
     self.q = Queue(1) 
     self.put_lock = RLock() 

    def get(self): 
     value = self.q.get(block=True) 
     self.q.task_done() 
     return value 

    def put(self, item): 
     with self.put_lock: 
      self.q.put(item, block=True) 
      self.q.join()