2015-03-30 11 views
7

मैं आइटम अनुरोध/प्रतिक्रिया चक्र के बाहर संसाधित करने की आवश्यकता है कि क़तार में एक तूफान वेब सर्वर का उपयोग कर रहा में एक प्रसंस्करण कतार बना रहा है।तूफान

नीचे मेरी सरल उदाहरण में, हर बार एक अनुरोध में आता है, मैं एक नया स्ट्रिंग queued_items नामक एक सूची में जोड़ें। मैं ऐसा कुछ बनाना चाहता हूं जो उस सूची को देखे और आइटम को संसाधित करे जैसा कि वे इसमें दिखाई देते हैं।

(मेरे असली कोड में, आइटम संसाधित हो जाते हैं और एक टीसीपी सॉकेट पर भेजे जाते हैं जो वेब अनुरोध आने पर कनेक्ट हो सकता है या नहीं भी हो सकता है। मैं चाहता हूं कि वेब सर्वर सॉकेट कनेक्शन के बावजूद आइटम कतार में रखे)

मैं इस कोड को सरल बनाए रखना और Redis या बीनस्टॉक जैसे बाहरी कतारों/कार्यक्रमों का उपयोग नहीं कोशिश कर रहा हूँ। यह बहुत अधिक मात्रा में नहीं होने वाला है।

तूफान मुहावरे का उपयोग कर नए आइटम के लिए client.queued_items सूची देख सकते हैं और उन्हें कार्रवाई करने के लिए आते ही उन्हें एक अच्छा तरीका क्या है?

import time 

import tornado.ioloop 
import tornado.gen 
import tornado.web 

class Client(): 

    def __init__(self): 
     self.queued_items = [] 

    @tornado.gen.coroutine 
    def watch_queue(self): 
     # I have no idea what I'm doing 
     items = yield client.queued_items 
     # go_do_some_thing_with_items(items) 

class IndexHandler(tornado.web.RequestHandler): 

    def get(self): 
     client.queued_items.append("%f" % time.time()) 
     self.write("Queued a new item") 

if __name__ == "__main__": 

    client = Client() 

    # Watch the queue for when new items show up 
    client.watch_queue() 

    # Create the web server 
    application = tornado.web.Application([ 
     (r'/', IndexHandler), 
    ], debug=True) 

    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

उत्तर

11

एक पुस्तकालय toro कहा जाता है, जो tornado के लिए तुल्यकालन पुरातन प्रदान करता है। [अद्यतन: बवंडर 4.2 के रूप में, torotornado में विलय कर दिया गया है।] की तरह तुम सिर्फ एक toro.Queue (या tornado.queues.Queuetornado 4.2+ में) इस्तेमाल कर सकते हैं इस संभाल करने

ध्वनि: वहाँ

import time 

import toro 
import tornado.ioloop 
import tornado.gen 
import tornado.web 

class Client(): 

    def __init__(self): 
     self.queued_items = toro.Queue() 

    @tornado.gen.coroutine 
    def watch_queue(self): 
     while True: 
      items = yield self.queued_items.get() 
      # go_do_something_with_items(items) 

class IndexHandler(tornado.web.RequestHandler): 

    @tornado.gen.coroutine 
    def get(self): 
     yield client.queued_items.put("%f" % time.time()) 
     self.write("Queued a new item") 

if __name__ == "__main__": 

    client = Client() 

    # Watch the queue for when new items show up 
    tornado.ioloop.IOLoop.instance().add_callback(client.watch_queue) 

    # Create the web server 
    application = tornado.web.Application([ 
     (r'/', IndexHandler), 
    ], debug=True) 

    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

कुछ बदलाव के लिए आवश्यक हैं एक toro.Queue करने के लिए एक सूची से डेटा संरचना स्विच करने से एक तरफ,:

  1. हमशेड्यूल करने के लिए की जरूरत है 10 IOLoop संदर्भ के बाहर सीधे इसे कॉल करने की कोशिश करने के बजाय, add_callback का उपयोग करके IOLoop के अंदर चलाने के लिए। क्योंकि toro.Queue.put एक coroutine है
  2. IndexHandler.get, एक coroutine करने के लिए परिवर्तित किया जाना चाहिए।

मैं भी एक while True पाश watch_queue है, ताकि यह हमेशा के लिए केवल एक आइटम प्रसंस्करण और फिर बाहर निकलने के बजाय चलाया जाएगा, जोड़ा।

+0

यह मैं वास्तव में क्या जरूरत है। मुझे यह दिखाने के लिए धन्यवाद कि इसे कैसे कार्यान्वित किया जाए। – Scott

+0

डैनो - मैं कतार को कैसे देख सकता हूं? जब मेरा कनेक्शन खराब हो जाता है, तो मुझे अस्थायी रूप से कतार में वस्तुओं को संसाधित करना बंद कर देना होगा, लेकिन उन्हें खोना नहीं होगा। – Scott

+1

टोरो को टर्ननाडो में विलय कर दिया गया है और अब इसे हटा दिया गया है। टॉरनाडो के लिए> = 4.2 आप 'tornado.queues.Queue' –

संबंधित मुद्दे