在多线程应用程序中使用 mongodb 的正确方法
Posted
技术标签:
【中文标题】在多线程应用程序中使用 mongodb 的正确方法【英文标题】:proper way to use mongodb in multi-threading application 【发布时间】:2015-09-29 01:13:43 【问题描述】:我有带有 cron 任务的服务器应用程序(在自己的线程中),我想将数据插入 mongodb 数据库,并且我想避免死锁或其他多线程问题。
我的代码:
from multiprocessing.dummy import Pool as ThreadPool
from pymongo import MongoClient
import sched
import time
TIME_INTERVAL = 3
THREAD_NUMBER = 4
s = sched.scheduler(time.time, time.sleep)
pool = ThreadPool(THREAD_NUMBER)
websites = [
"website1",
"website2",
"website3",
"website4",
]
def insert_to_mongo(result):
#that is proper way ?
mongo_client = MongoClient('localhost', 27017)
dic = mongo_client["cjgs"]["tracks"]
dic.insert("Result": result)
def parsing_site(station):
print "Doing stuff for ", station
insert_to_mongo("Result for " + station)
def recursion(sc, station):
parsing_site(station)
sc.enter(TIME_INTERVAL, 1, recursion, (sc, station,))
def run_cron_task(station):
s.enter(TIME_INTERVAL, 1, recursion, (s, station,))
s.run()
pool.map(run_cron_task, websites)
在这种情况下如何使用 mongodb ?如何使用装饰器和其他语法糖以更 Python 风格的方式编写这段代码?
【问题讨论】:
【参考方案1】:您可以使用装饰器将所有线程内容封装到其中,如下所示:
def your_decorator(fun):
# your threading stuff with fun
@decorator
def you_fun():
# etc
但我建议你宁愿看一下 Two Phase Commit,这是 MongoDB 自己推荐的。
【讨论】:
以上是关于在多线程应用程序中使用 mongodb 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章