Пока у вас есть один поток (как в приведенном выше фрагменте, где вы создаете Recon
только один раз), не должно иметь большого значения, что вы делаете, где; но, конечно, я думаю, что причина, по которой вы вводите многопоточность, заключается в том, чтобы в конечном итоге перейти к активным нескольким потокам.
Если это так, то первой ключевой проблемой является обеспечение того, чтобы у вас никогда не было двух или более потоков одновременно, пытающихся использовать одну и ту же общую систему / ресурс - например, несколько потоков записывают одновременно в ReconFile
, в случае кода, указанного в URL-адресе пастбина.
Классический способ избежать таких проблем - использовать блокировку, но мой любимый способ совершенно иной: убедитесь, что к любому такому ресурсу обращаются только один выделенный поток, и используйте экземпляр Queue.Queue (по сути потокобезопасный), чтобы другие потоки отправляют рабочий запрос в выделенный поток (поэтому вместо прямой записи в ReconFile каждый поток будет составлять список строк, которые будут записаны непрерывно, а затем .put
список в очереди, в которой находится рабочий поток "перезаписи файла") ожидание через .get
).
Когда вам нужно получить результаты от таких действий (не здесь), запрашивающий поток помещает свою собственную «очередь, в которую нужно возвращать результаты» как часть «пакета рабочего запроса», который он передает работнику. очередь потока. Я представил гораздо больше подробностей об этой рекомендуемой архитектуре в главе о многопоточности «Python in a Nutshell», 2-е издание (и почему, как автор книги, я, конечно, никогда не рекомендую , если вы выполняете нелегальную загрузку из бесплатной пиратской копии моей книги, однако, я могу упомянуть, что есть множество сайтов, предлагающих такие пиратские копии для скачивания - легальный способ прочитать мою книгу бесплатно - это подписаться на пробное предложение для O'Reilly's " safari " веб-сайт онлайн-книг).
Это не решает конкретную проблему, которую вы наблюдаете, поскольку это происходит, когда у вас есть только один поток вокруг. Я заметил, что поток пытается выполнить много операций ввода-вывода для стандартного ввода и стандартного вывода, что, возможно, является проблематичным для потока - рассмотрите возможность ввода для потока до того, как вы его запустите (в основном для необходимого вывода используйте стандартный модуль Python logging
, который равен гарантированно поточно-ориентирован. Вы все еще наблюдаете проблемы? Если это так, то следующим шагом будет добавление в ваш код вызовов logging.info
, чтобы вы могли точно определить, где он остановился, - и рассказать нам об этом, чтобы мы могли попытаться помочь оттуда!