Как я могу исправить этот многопоточный сценарий Python?

Я пишу сценарий Python, чтобы прочитать список доменов, узнать то, что оценка услуг McAfee Siteadvisor дает, затем произвела домен и результат к CSV.

Я основывал свой сценарий от этого предыдущего ответа. Это использует urllib для очистки страницы Siteadvisor для рассматриваемого домена (не лучший метод, я знаю, но Siteadvisor не обеспечивает альтернативы). К сожалению, этому не удается произвести что-либо - я последовательно получаю эту ошибку:

Traceback (most recent call last):
  File "multi.py", line 55, in 
    main()
  File "multi.py", line 44, in main
    resolver_thread.start()
  File "/usr/lib/python2.6/threading.py", line 474, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

Вот мой сценарий:

import threading
import urllib

class Resolver(threading.Thread):
    def __init__(self, address, result_dict):
        threading.Thread.__init__(self)
        self.address = address
        self.result_dict = result_dict

    def run(self):
        try:
            content = urllib.urlopen("http://www.siteadvisor.com/sites/" + self.address).read(12000)
            search1 = content.find("didn't find any significant problems.")
            search2 = content.find('yellow')
            search3 = content.find('web reputation analysis found potential security')
            search4 = content.find("don't have the results yet.")

            if search1 != -1:
                result = "safe"
            elif search2 != -1:
                result = "caution"
            elif search3 != -1:
                result = "warning"
            elif search4 != -1:
                result = "unknown"
            else:
                result = ""

            self.result_dict[self.address] = result

        except:
            pass


def main():
    infile = open("domainslist", "r")
    intext = infile.readlines()
    threads = []
    results = {}
    for address in [address.strip() for address in intext if address.strip()]:
        resolver_thread = Resolver(address, results)
        threads.append(resolver_thread)
        resolver_thread.start()

    for thread in threads:
        thread.join()

    outfile = open('final.csv', 'w')
    outfile.write("\n".join("%s,%s" % (address, ip) for address, ip in results.iteritems()))
    outfile.close()

if __name__ == '__main__':
    main()

Любая справка значительно ценилась бы.

1
задан Community 23 May 2017 в 10:24
поделиться

2 ответа

Похоже, вы пытаетесь запустить слишком много потоков.

Вы можете проверить, сколько элементов находится в [address.strip () для адреса в intext, если address.strip ()] список. Я думаю, это проблема. В основном существует предел доступных ресурсов, который позволяет запускать новые потоки.

Решение состоит в том, чтобы разбить ваш список на части, скажем, по 20 элементов, выполнить все необходимое (в 20 потоках), дождаться, пока потоки завершат свою работу, и затем выбрать следующий фрагмент. Делайте это, пока не будут обработаны все элементы из вашего списка.

Вы также можете использовать некоторый пул потоков для лучшего управления потоками. (Недавно я использовал эту реализацию ).

1
ответ дан 2 September 2019 в 23:29
поделиться

Вероятно, существует верхний предел количества создаваемых потоков, и вы, вероятно, его превышаете.

Предложение: создайте небольшое фиксированное количество резолверов - менее 10, вероятно, даст вам 90% возможного преимущества параллелизма - и (потокобезопасную) очередь из библиотеки очереди python. Попросите основной поток выгрузить все домены в очередь, а каждый преобразователь будет брать по одному домену из очереди и работать с ним.

1
ответ дан 2 September 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: