เว็บทอร์นาโดและเธรด

ฉันยังใหม่กับ Tornado และ Python Threads สิ่งที่ฉันต้องการบรรลุคือ: ฉันมีเว็บเซิร์ฟเวอร์ Tornado ซึ่งรับคำขอจากผู้ใช้ ฉันต้องการจัดเก็บข้อมูลบางส่วนไว้ในเครื่องและเขียนลงในฐานข้อมูลเป็นระยะๆ โดยเป็นการแทรกจำนวนมาก

import tornado.ioloop
import tornado.web
import threading

# Keep userData locally in memory
UserData = {}

def background(f):
    """
    a threading decorator
    use @background above the function you want to thread
    (run in the background)
    """
    def bg_f(*a, **kw):
        threading.Thread(target=f, args=a, kwargs=kw).start()
    return bg_f

@background
def PostRecentDataToDBThread(iter = -1):
    i = 0
    while iter == -1 or i < iter: 
        #send data to DB
        UserData = {}
        time.sleep(5*60)
        i = i + 1

class AddHandler(tornado.web.RequestHandler):
    def post(self):
        userID = self.get_argument('ui')
        Data = self.get_argument('data')

        UserData[userID] = Data 


if __name__ == "__main__":
    tornado.options.parse_command_line()

    print("start PostRecentDataToDBThread")
    ### Here we start a thread that periodically sends data to the data base.
    ### The thread is called every 5min. 
    PostRecentDataToDBThread(-1)

    print("Started tornado on port: %d" % options.port)

    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/add", AddHandler)
    ])
    application.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

นี่เป็นวิธีที่ดีในการบรรลุเป้าหมายของฉันหรือไม่? ฉันต้องการลดเวลาการบล็อกเซิร์ฟเวอร์ให้เหลือน้อยที่สุด หรือฉันควรใช้ gevent หรืออย่างอื่นแทน? ฉันสามารถประสบปัญหาโดยการเข้าถึง UserData ทั้งจาก Tornado และเธรดได้หรือไม่ ความสอดคล้องของข้อมูลไม่สำคัญนักตราบใดที่เซิร์ฟเวอร์ไม่ล่ม


person Mjdgard    schedule 21.10.2011    source แหล่งที่มา


คำตอบ (1)


ทอร์นาโดไม่ได้มีวัตถุประสงค์เพื่อใช้กับมัลติเธรด มันขึ้นอยู่กับ epoll เพื่อสลับบริบทระหว่างส่วนต่าง ๆ ของโค้ด

โดยทั่วไป ฉันขอแนะนำให้ส่งข้อมูลไปยังกระบวนการของผู้ปฏิบัติงานแยกกันผ่านคิวข้อความ (เช่น pika+RabbitMQ ซึ่งทำงานร่วมกับ Tornado ได้เป็นอย่างดี) . กระบวนการของผู้ปฏิบัติงานสามารถรวบรวมข้อความพร้อมข้อมูลและเขียนลงในฐานข้อมูลเป็นชุด หรือคุณสามารถใช้ตรรกะอื่นใดในการประมวลผลข้อมูลด้วยการตั้งค่านี้

หรือคุณสามารถใช้ Redis กับ brukva เพื่อเขียนข้อมูลขาเข้าแบบอะซิงโครนัสไปยังฐานข้อมูลในหน่วยความจำ ซึ่งในทางกลับกันก็จะเป็นแบบอะซิงโครนัส ดัมพ์ลงดิสก์ขึ้นอยู่กับการกำหนดค่า Redis

person Ivan Blinkov    schedule 06.11.2011