2010-12-12 42 views
2

我想执行一个线程里面Django的call_method内Django的call_command。 这是示例代码:问题与线程

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),则创建仅
一个线程(这就是我想要的)。
在此先感谢!

+0

请注意,这不会是一个很好的方法;如果端口8000被采用了怎么办?或者如果别的东西想要8000端口呢?至少,使用半随机端口号。 – 2010-12-12 12:22:52

+0

使用'multiprocessing'而不是'threading'发生同样的事情。 – 2011-09-29 08:58:46

回答

0

我想,这可能是由Django的内部服务器重装所有的模块是它的习惯造成的。尝试任何的--noreload相当于是call_command(可能call_command("runserver", noreload=True),但我不知道)。

(也QThread S被QApplication.exec_()开始。除非你有特殊要求提前开始吧,我不相信你应该运行starter.start()自己)

+0

我已经从我的问题中删除了GUI的东西。 – ApprenticePython 2010-12-12 15:41:11

5

我找到了解决方案(克里斯·摩根是正确的) 。此代码按我的意愿工作:

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()