gpt4 book ai didi

Python 线程挂起

转载 作者:太空狗 更新时间:2023-10-29 18:23:32 25 4
gpt4 key购买 nike

我有一个遵循标准范例的简单线程 Python 程序:

class SearchThread(threading.Thread):
def __init__(self, search_queue):
threading.Thread.__init__(self)
self.search_queue = search_queue

def run(self):
while True:
try:
search_url = self.search_queue.get(timeout=15)
# <do Internet search and print output/>
except Queue.Empty:
self.search_queue.task_done()
break
except Exception, e:
print e

if __name__ == '__main__':
search_queue = Queue.Queue()
for i in range(200):
t = SearchThread(search_queue)
t.setDaemon(True)
t.start()
search_queue.join()

队列中充满了大约 1000 个 url 和简单的 HTTP GET<do Internet search and print output/> 中执行.问题是在处理了大约 500-700 个条目后(这只需要几秒钟),程序始终挂起,没有任何输出,无一异常(exception),什么都没有。

我试过了 requests , urllib2 , urllib3 , httplib2对于 HTTP GET但没有任何变化。

如何调试挂起的线程 Python 程序?

顺便说一句,我在 Ubuntu 11.10(64 位)下使用 Python 2.7。

编辑

在挂起过程中盯着 gdb 跟踪时,我和以前一样无能为力 --

sudo gdb python 9602
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
...
(gdb) where
#0 0x00007fc09ea91300 in sem_wait () from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x00000000004ed001 in PyThread_acquire_lock ()
#2 0x00000000004f02de in ?? ()
#3 0x00000000004b6569 in PyEval_EvalFrameEx ()
#4 0x00000000004bcd2d in PyEval_EvalCodeEx ()
#5 0x00000000004b6a5b in PyEval_EvalFrameEx ()
#6 0x00000000004b6d77 in PyEval_EvalFrameEx ()
#7 0x00000000004bcd2d in PyEval_EvalCodeEx ()
#8 0x00000000004bd802 in PyEval_EvalCode ()
#9 0x00000000004dcc22 in ?? ()
#10 0x00000000004dd7e4 in PyRun_FileExFlags ()
#11 0x00000000004de2ee in PyRun_SimpleFileExFlags ()
#12 0x00000000004ee6dd in Py_Main ()
#13 0x00007fc09d86030d in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
#14 0x000000000041cb69 in _start ()

最佳答案

我写了一个模块,打印出在一个地方挂起时间超过 10 秒的线程。 hanging_threads.py ( package )

这是一个示例输出:

--------------------    Thread 5588     --------------------
File "C:\python33\lib\threading.py", line 844, in _exitfunc
t.join()
File "C:\python33\lib\threading.py", line 743, in join
self._block.wait()
File "C:\python33\lib\threading.py", line 184, in wait
waiter.acquire()

当您忘记将另一个线程设置为守护进程时,这会在主线程退出时发生。

关于Python 线程挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com