Moo*_*ker 4 python apache django multithreading mod-wsgi
我正在尝试从django进程执行简单的网络作业(ping).Django是通过apache的mod_wsgi部署的.但代码仅在首次运行时有效,在后续运行时返回以下错误.
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/var/www/propingui/ping/views.py" in ping
32. p = Pool(len(fls))
File "/usr/lib/python2.7/multiprocessing/pool.py" in __init__
674. Pool.__init__(self, processes, initializer, initargs)
File "/usr/lib/python2.7/multiprocessing/pool.py" in __init__
134. self._repopulate_pool()
File "/usr/lib/python2.7/multiprocessing/pool.py" in _repopulate_pool
197. w.start()
File "/usr/lib/python2.7/multiprocessing/dummy/__init__.py" in start
73. self._parent._children[self] = None
Exception Type: AttributeError at /
Exception Value: '_DummyThread' object has no attribute '_children'
Run Code Online (Sandbox Code Playgroud)
代码如下:
from multiprocessing.pool import ThreadPool as Pool
...
def _ping((host, firing_location)):
pinger = Pyro4.Proxy("PYRONAME:" + firing_location)
return pinger.ping(host)
def ping(request):
if request.method == 'POST':
form = PingForm(request.POST)
if form.is_valid():
host = form.cleaned_data['host']
fls = ['g1','a1']
p = Pool(len(fls))
noanswer = False
try:
jobs = p.map(_ping, zip([host]*len(fls), fls) )
except:
jobs = []
...
return ...
Run Code Online (Sandbox Code Playgroud)
我试图谷歌错误,但没有发现任何东西,我不明白问题的确切来源.有趣的是,如果我将ThreadPool更改为多处理池,一切正常.我认为这是由于在django中产生线程的问题而引起的.
这很可能是一个已知的Python错误,它在threading.Thread中使用ThreadPool时发生.
有no good solution这个问题,只是在你想要使用ThreadPool的线程中调用以下内容的解决方法:
if not hasattr(threading.current_thread(), "_children"):
threading.current_thread()._children = weakref.WeakKeyDictionary()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1635 次 |
| 最近记录: |