繁体   English   中英

带有线程的随机python模块加载失败

[英]Random python module loading failures with threading

我正在尝试调试一个错误,其中python import语句随机失败,而其他时候它们运行得很干净。

这是我看到的异常的一个示例。 有时我会看到这个,有时我会在另一个模块中看到另一个,尽管它似乎总是出现在4个模块之一中。

ERROR:root:/home/user/projecteat/django/contrib/auth/management/__init__.py:25:     RuntimeWarning: Parent module 'django.contrib.auth.management' not found while handling absolute import
from django.contrib.contenttypes.models import ContentType

由于随机性,我几乎可以肯定这是一个线程问题,但是我不明白为什么会出现导入错误,因此我不确定要在调试中寻找什么。 如果不同的线程试图加载相同的模块,这可能是由文件系统争用引起的吗?

我正在尝试让Django 1.4的LiveServerTestCase在Google App Engine的开发服务器上工作。 主线程运行django的测试框架。 加载基于LiveServerTestCase的测试类时,它会生成一个子线程,该子线程将启动App Engine dev_appserver(这是本地网络服务器)。 主线程使用Selenium驱动程序发出HTTP请求,继续运行测试,该请求由子线程上的dev_appserver处理。

在删除测试用例类之前,测试框架可以在基于LiveServerTestCase的类中运行一些测试。 拆卸时,子线程结束。

看起来异常发生在子线程(HTTP服务器)中,通常在单个测试用例类中的测试之间。

App Engine LiveServerTestCase类的代码在此处: https : //github.com/dragonx/djangoappengine/blob/django-1.4/test.py

提供此问题所需的所有调试信息非常困难。 我主要是在寻找有关为什么python import语句会产生RuntimeWarning错误的建议。

我对自己的问题有部分答案。 这是怎么回事,我有两个线程在运行。

线程1正在运行dev_appserver(dev_appserver_main)内部的主要内部函数,该函数正在处理HTTP请求。

线程2正在运行基于Selenium的测试用例。 该线程将向浏览器发送命令以执行某些操作(然后间接生成HTTP请求并重新进入线程1)。 然后,它向Selenium发出更多请求以检查状态,或进行数据存储区查询以检查结果。

认为问题在于,在处理每个HTTP请求时,线程1(dev_appserver)会更改环境,以便某些文件夹不可访问(app.yaml中排除的文件夹以及不属于appengine的环境)。 如果线程2恰巧此时运行某些代码,则某些导入文件如果位于这些文件夹中,则可能无法加载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM