【问题标题】:Problem with django's call_command inside a Thread线程内django的call_command问题
【发布时间】:2011-05-24 03:15:13
【问题描述】:

我会在一个线程中执行 django 的 call_method。 这是示例代码:

import sys
sys.path.append("/my/django/project/path/")
import threading
import time 


# Import my django project configuration settings
from django.core.management import setup_environ
from mydjangoprojectname import settings
setup_environ(settings)

from django.core.management import call_command

class ServerStarter(threading.Thread):
    def __init__(self):
        super(ServerStarter, self).__init__()
        print "ServerStarter instance created"

    def run(self):
        print "Starting Django Server..."
        call_command("runserver", noreload=True)


if __name__ == '__main__':
    starter = ServerStarter()
    starter.start()

------------------------------
OutPut:
ServerStarter instance created
Starting Django Server...
ServerStarter instance created
Starting Django Server...
Validating models...
0 errors found
Django version 1.2.3, using settings 'mydjangoprojectname.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Django 服务器正确启动,但 ServerStarter 被创建两次
ServerStarter 的两个实例都运行。
如果我在 run 方法中注释 call_command("runserver", noreload=True) ,那么只有
创建了一个线程(这就是我想要的)。
提前致谢!

【问题讨论】:

  • 请注意,这不是一个很好的方法;如果端口 8000 被占用怎么办?或者如果其他东西想要端口 8000 怎么办?至少,使用一个半随机的端口号。
  • 使用multiprocessing而不是threading会发生同样的事情。

标签: python django multithreading pyqt pyside


【解决方案1】:

我找到了解决方案(Chris Morgan 是对的)。这段代码可以按我的意愿工作:

import sys
sys.path.append("/my/django/project/path/")
import threading

# Import my django project configuration settings
from django.core.management import setup_environ, ManagementUtility

from mydjangoprojectname import settings
setup_environ(settings)


class ServerStarter(threading.Thread):
    def __init__(self):
        super(ServerStarter, self).__init__()
        print "ServerStarter instance created"

    def run(self):
        print "Starting Django Server..."
        utility = ManagementUtility()
        command = utility.fetch_command('runserver')
        command.execute(use_reloader=False)


if __name__ == '__main__':
    starter = ServerStarter()
    starter.start()

【讨论】:

    【解决方案2】:

    我认为这可能是由于 Django 内部服务器按惯例重新加载所有模块造成的。试试--noreload 对应的call_command(可能是call_command("runserver", noreload=True),但我不确定)。

    (同样QThreads 是由QApplication.exec_() 启动的;除非您有特殊要求更早启动它,否则我不认为您应该自己运行starter.start()。)

    【讨论】:

    • 我已经从我的问题中删除了 GUI 内容。
    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多