在线程应用程序中使用Django ORM的最佳实践

时间:2017-06-02 15:22:00

标签: python django

我正在研究一个使用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)

1 个答案:

答案 0 :(得分:-1)

解决。经过无数个小时的实验和谷歌搜索,我终于找到了我正在寻找的here。我从python的threading.Thread类继承了模块类,它解决了所有问题。