我正在研究一个使用Django ORM和MySQL的多线程应用程序。我们的想法是使用单个启动脚本来启动多个模块(这里的“模块”在功能意义上,而不是文字Python意义上),每个模块都有一个在自己的线程中运行的“服务循环”。我为每个模块使用单个类组织它。
我最初使用sqlite DB做到了这一点并且效果很好。现在我正在转向MySQL并遇到与线程相关的数据库连接问题。例如,看起来我需要在每个线程中调用db.connections.close_all()以避免与数据库连接争用?我想我需要将与Django ORM相关的所有设置移动到服务线程,但后来我无法在类的init()方法中导入模型。
无论如何,我确信其他人之前已经处理过这个问题,我相信那里有一些好的模式。有人可以分享任何建议或最佳做法吗?
这是我的简单启动脚本:
from controller.modules.manager import Manager
from controller.modules.scanner import Scanner
print("Starting...")
# The directory scanner
scanner = Scanner()
# The job manager
manager = Manager()
以下是其中一个模块(Scanner类)的示例:
import os
from multiprocessing import Process
from time import sleep
import threading
import django
# Need to do this before importing models
from common.utilities.os import OS
os.environ["DJANGO_SETTINGS_MODULE"] = "common.settings"
django.setup()
# Import models here
class Scanner:
def __init__(self):
# Define some member variables here, some of which include
# DB models
# Launch service loop
Process(target=self.service_loop, name='service loop').start()
def service_loop(self):
while True:
# Scan some directories and update some DB entries
# Throttle the loop
sleep(config.THROTTLE_SLEEP_TIME_SEC)