Python Fils Accrocher

J'ai un simple filetée programme en Python suivant la norme paradigme:

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

La file d'attente est rempli avec environ 1000 urls et simple HTTP GET est effectuée dans <do Internet search and print output/>. Le problème est que, après le traitement de certains de 500 à 700 entrées (qui ne prend que quelques secondes), le programme se bloque constamment pour toujours avec pas de sortie, pas d'exception, rien.

J'ai essayé requests, urllib2, urllib3, httplib2 pour la HTTP GET mais rien ne change.

Comment déboguer pendaison filetée programme en Python?

BTW, je suis à l'aide de Python 2.7 sous Ubuntu 11.10 (64bit).

modifier

Je suis aussi paumé qu'avant quand regarder le gdb trace sur le support de processus --

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 ()
Vous pouvez insérer la journalisation des états afin de déterminer dans quelle ligne de votre code, le programme se bloque.
essayez de suivre ce tutoriel
J'ai eu un problème similaire ici: stackoverflow.com/questions/28223414/...

OriginalL'auteur Jerry | 2012-04-04