ฉันยังใหม่กับ 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 และเธรดได้หรือไม่ ความสอดคล้องของข้อมูลไม่สำคัญนักตราบใดที่เซิร์ฟเวอร์ไม่ล่ม