我是 Tornado 和 Python 线程的新手。我想要实现的目标如下:
我有一个龙卷风网络服务器,它接受用户的请求。我想在本地存储一些数据,并定期将其作为批量插入写入数据库。
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 还是其他什么?从 Tornado 和线程访问 UserData 是否会遇到问题?只要服务器不崩溃,数据一致性在这里就不那么重要了。
Tornado 不适合与多线程一起使用。它基于 epoll 在代码的不同部分之间切换上下文。
一般来说,我建议通过消息队列将数据发送到单独的工作进程(例如pika https://github.com/pika/pika+RabbitMQ,它与Tornado集成得很好)。工作进程可以累积带有数据的消息并将它们批量写入数据库,或者您可以使用此设置实现任何其他数据处理逻辑。
或者,您可以使用 Redis 等brukva https://github.com/kmerenkov/brukva仅将传入数据异步写入内存数据库,然后根据 Redis 配置将其异步转储到磁盘。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)