Python-Threads Hängen

Ich habe ein einfaches threaded Python-Programm des standard-Paradigma:

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

Die Warteschlange ist gefüllt mit über 1000 urls und einfache HTTP GET erfolgt in <do Internet search and print output/>. Das problem ist, dass nach der Bearbeitung zwischen 500 und 700 Einträge (dauert nur Sekunden), das Programm konsequent hängt ewig kein output, keine Ausnahme, nix.

Ich habe versucht requests, urllib2, urllib3, httplib2 für die HTTP GET aber es ändert sich nichts.

Wie prüfst du hängen threaded Python-Programm?

BTW, ich bin mit Python 2.7 unter Ubuntu 11.10 (64bit).

Bearbeiten

Bin ich genauso ratlos wie vorher, wenn starrte auf den gdb Spuren auf den hängen Prozess -

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 ()
InformationsquelleAutor Jerry | 2012-04-04
Schreibe einen Kommentar