स्वीकृत उत्तर अप्रचलित है क्योंकि रेडिस-पी आपको गैर-अवरुद्ध get_message()
का उपयोग करने की सलाह देता है। लेकिन यह थ्रेड का आसानी से उपयोग करने का एक तरीका भी प्रदान करता है।
https://pypi.python.org/pypi/redis
संदेशों को पढ़ने के लिए तीन अलग-अलग रणनीतियों रहे हैं।
दृश्यों के पीछे, get_message() कनेक्शन के सॉकेट को त्वरित रूप से मतदान करने के लिए सिस्टम के 'चयन' मॉड्यूल का उपयोग करता है। यदि डेटा पढ़ने के लिए उपलब्ध है, get_message() इसे पढ़ेगा, संदेश स्वरूपित करेगा और इसे वापस कर देगा या इसे एक संदेश हैंडलर को पास कर देगा। यदि पढ़ने के लिए कोई डेटा नहीं है, तो get_message() तुरंत कोई नहीं लौटाएगा। यह आपके आवेदन के अंदर एक मौजूदा घटना पाश में एकीकृत करने के लिए तुच्छ बनाता है।
while True:
message = p.get_message()
if message:
# do something with the message
time.sleep(0.001) # be nice to the system :)
रेडिस-पीई के पुराने संस्करण केवल pubsub.listen() के साथ संदेश पढ़ते हैं। सुनो() एक जेनरेटर है जो एक संदेश उपलब्ध होने तक ब्लॉक करता है। यदि आपके आवेदन को कुछ और करने की आवश्यकता नहीं है लेकिन रेडिस से प्राप्त संदेशों पर प्राप्त करें और कार्य करें, तो सुनें() चलने का एक आसान तरीका है।
for message in p.listen():
# do something with the message
तीसरा विकल्प एक अलग थ्रेड में इवेंट लूप चलाता है। pubsub.run_in_thread() एक नया धागा बनाता है और इवेंट लूप शुरू करता है। थ्रेड ऑब्जेक्ट run_in_thread() के कॉलर पर वापस कर दिया जाता है। कॉलर इवेंट लूप और थ्रेड को बंद करने के लिए thread.stop() विधि का उपयोग कर सकते हैं। दृश्यों के पीछे, यह get_message() के आस-पास एक रैपर है जो एक अलग थ्रेड में चलता है, अनिवार्य रूप से आपके लिए एक छोटा गैर-अवरुद्ध ईवेंट लूप बना रहा है। run_in_thread() एक वैकल्पिक sleep_time तर्क लेता है। यदि निर्दिष्ट किया गया है, तो ईवेंट लूप लूप के प्रत्येक पुनरावृत्ति में मान के साथ time.sleep() को कॉल करेगा।
नोट: चूंकि हम एक अलग थ्रेड में चल रहे हैं, इसलिए संदेशों को संभालने का कोई तरीका नहीं है जो स्वचालित रूप से पंजीकृत संदेश हैंडलर से प्रबंधित नहीं होते हैं। इसलिए, redis-py आपको run_in_thread() को कॉल करने से रोकता है यदि आपने पैटर्न या चैनलों की सदस्यता ली है जिनके पास संदेश हैंडलर संलग्न नहीं हैं।
p.subscribe(**{'my-channel': my_handler})
thread = p.run_in_thread(sleep_time=0.001)
# the event loop is now running in the background processing messages
# when it's time to shut it down...
thread.stop()
तो आप सवाल का जवाब देने के लिए, जब आप जानना चाहते हैं कि कोई संदेश आया है तो get_message की जांच करें।
क्या कोई कारण है कि आप सुनकर अवरुद्ध नहीं होना चाहते हैं? रेडिस कनेक्शन बहुत सस्ते हैं और आम तौर पर उनमें से कई को आम तौर पर विकसित करना आम है। –
रेडिस, जेडएमक्यू, टॉरनाडो का उपयोग करके पायथन में असिंक्रोनस पबसब - https://github.com/abhinavsingh/async_pubsub –
.listen() के बजाय पबब ऑब्जेक्ट की .get_message() विधि का उपयोग करें (नीचे एक उदाहरण है)। [जब यह प्रश्न पोस्ट किया गया था तो उस विधि को पायथन रेडिस ड्राइवर में समर्थित नहीं किया गया हो सकता है]। –