【发布时间】:2013-01-04 18:01:09
【问题描述】:
我正在尝试创建一个 Web 应用程序作为另一个 Python 应用程序的前端。我让用户在表单中输入数据,提交后,想法是将数据保存在数据库中,并将数据传递给线程对象类。线程是基于用户操作严格启动的。我的问题是我可以导入线程,但无法访问 threading.Thread。当线程结束时,它会更新服务器,所以当用户查看作业信息时,他们会看到结果。
查看:
@login_required(login_url='/login')
def createNetworkView(request):
if request.method == "POST":
# grab my variables from POST
job = models.MyJob()
# load my variables into MyJob object
job.save()
t = ProcessJobThread(job.id, my, various, POST, inputs, here)
t.start()
return HttpResponseRedirect("/viewJob?jobID=" + str(job.id))
else:
return HttpResponseRedirect("/")
我的线程类:
import threading # this works
print "About to make thread object" # This works, I see this in the log
class CreateNetworkThread(threading.Thread): # failure here
def __init__(self, jobid, blah1, blah2, blah3):
threading.Thread.__init__(self)
def run(self):
doCoolStuff()
updateDB()
我明白了:
Exception Type: ImportError
Exception Value: cannot import name Thread
但是,如果我在命令行上运行 python,我可以导入线程,也可以从线程导入线程。有什么关系?
我见过其他的东西,比如How to use thread in Django 和Celery,但这似乎有点过头了,我不明白这个例子是如何导入线程和使用 threading.Thread 的,而我不能。 谢谢。
编辑:我正在使用 Django 1.4.1、Python 2.7.3、Ubuntu 12.10、SQLite 作为数据库,并且我正在使用 ./manage.py runserver 运行 Web 应用程序。
【问题讨论】:
-
线程类模块文件叫什么名字?如果您将其命名为“threading.py”,那么您将隐藏 python 线程模块。
-
请显示实际的完整回溯。您显示的代码不会导致该错误,因为您没有导入 Thread (您会得到 AttributeError )。
-
@DanielRoseman:不,如果你选择了
from threading import Thread,你会得到一个看起来和他看到的一模一样的ImportError。 (但这并不会改变你的更大观点,即他向我们展示的代码不是他实际运行的代码。) -
@abarnert 这就是我的意思,在咖啡中他表明他只做
import threading,这不会给出那个错误。 -
@DanielRoseman:但你说如果他导入
Thread,他会得到AttributeError。这不是真的;他会得到ImportError,就像他展示的那样。同样,这并没有改变你的更大观点,即他向我们展示的不是他正在运行的......但通常让尚未学会如何提问的人感到困惑是一个坏主意。
标签: python django multithreading django-views