यहाँ एक गैर मतदान गैर अत्यधिक धागा समाधान है: जब भी वे बदलने के एक कॉलबैक आग मौजूदा Event
रों संशोधित, और कहा कि कॉलबैक में एक नई घटना की स्थापना संभाल:
import threading
def or_set(self):
self._set()
self.changed()
def or_clear(self):
self._clear()
self.changed()
def orify(e, changed_callback):
e._set = e.set
e._clear = e.clear
e.changed = changed_callback
e.set = lambda: or_set(e)
e.clear = lambda: or_clear(e)
def OrEvent(*events):
or_event = threading.Event()
def changed():
bools = [e.is_set() for e in events]
if any(bools):
or_event.set()
else:
or_event.clear()
for e in events:
orify(e, changed)
changed()
return or_event
नमूना उपयोग:
def wait_on(name, e):
print "Waiting on %s..." % (name,)
e.wait()
print "%s fired!" % (name,)
def test():
import time
e1 = threading.Event()
e2 = threading.Event()
or_e = OrEvent(e1, e2)
threading.Thread(target=wait_on, args=('e1', e1)).start()
time.sleep(0.05)
threading.Thread(target=wait_on, args=('e2', e2)).start()
time.sleep(0.05)
threading.Thread(target=wait_on, args=('or_e', or_e)).start()
time.sleep(0.05)
print "Firing e1 in 2 seconds..."
time.sleep(2)
e1.set()
time.sleep(0.05)
print "Firing e2 in 2 seconds..."
time.sleep(2)
e2.set()
time.sleep(0.05)
जिसके परिणामस्वरूप था:
Waiting on e1...
Waiting on e2...
Waiting on or_e...
Firing e1 in 2 seconds...
e1 fired!or_e fired!
Firing e2 in 2 seconds...
e2 fired!
गु थ्रेड-सुरक्षित होना चाहिए। किसी भी टिप्पणी का स्वागत है।
संपादित करें: ओह और यहां आपका wait_for_either
फ़ंक्शन है, हालांकि जिस तरह से मैंने कोड लिखा था, यह or_event
के आसपास बनाना और पास करना सबसे अच्छा है। ध्यान दें कि or_event
मैन्युअल रूप से सेट या साफ़ नहीं किया जाना चाहिए।
def wait_for_either(e1, e2):
OrEvent(e1, e2).wait()
क्या 2 अलग-अलग आयोजनों का उपयोग करने के लिए कोई अच्छा कारण है और इसका उपयोग नहीं किया जाता है? –
@ यूलियस आपके पास एक सिंगल थ्रेड है जिसे आप ईवेंट संचालित करना चाहते हैं, लेकिन इसमें 2 कतार हैं ... इसलिए जब आपको कोई आइटम प्राप्त होता है तो आपको जागने की आवश्यकता होती है – pyInTheSky
मुझे आश्चर्य है कि पाइथन में यह अंतर्निहित नहीं है। –