Инкремент и печать переменной каждый поток функция run () дает странные результаты - PullRequest
0 голосов
/ 18 октября 2018

Я хочу увеличивать переменную счетчика с помощью функции count () каждый раз, когда поток запускает функцию run ().Один и тот же поток вызывает функцию из другого модуля и выводит значение счетчика, которое должно быть назначено каждому потоку.Дело в том, что я получаю странные результаты при печати переменной, вместо получения списка 1, 2, 3 ... я получаю общее количество потоков, которые в данный момент запущены.

Это мой модуль потоков:

import threading
import proxies

threads_list = []
good_counter = 0
run_counter = 0
worker = None
num_threads=10
timeout=10

class Worker(threading.Thread):

    def __init__(self, timeout, proxy_list):
        threading.Thread.__init__(self)
        self.timeout = timeout
        self.proxy_list = proxy_list

    def run(self):
        global good_counter
        count()
        proxy_ip = proxies.get_proxy(proxies.get_proxylist())
        if proxies.is_proxy_good(proxy_ip):
            good_count()
            save_proxy(proxy_ip)
            print('[+] HIT ! - %s' % (proxy_ip))

def set_threads(num_threads, timeout, proxy_list):
    for i in range(num_threads):
        worker = Worker(timeout, proxies.get_proxylist())
        worker.setDaemon(True)
        worker.start()
        threads_list.append(worker)


def run_loop():
    while proxies.proxy_list.qsize() > 0:
        set_threads(num_threads, timeout, proxies.get_proxylist())
        for item in threads_list:
            item.join()
    print('[!] Proxylist Qsize < 0 QUITTING ....')


def get_counter():
    return run_counter

def count():
    global run_counter
    run_counter += 1

И это метод is_proxy_good (), который используется в модуле прокси и выводит run_counter всякий раз, когда происходит обработка исключения:

def is_proxy_good(proxy_ip):

try:
    r = requests.get('https://www.example.com',proxies=proxy_ip,timeout=15,headers=headers)
    if r.status_code is 200:
        return True
    return False

except requests.exceptions.Timeout:
    print('N%d - %s - Proxy Timeout\n' % (threads.get_counter(),proxy_ip))
    return False
except requests.exceptions.ProxyError:
    print('N%d - %s - Proxy ProxyError\n' % (threads.get_counter(),proxy_ip))
    return False
except requests.exceptions.SSLError:
    print('N%d - %s - Proxy SSLError\n' % (threads.get_counter(),proxy_ip))
    return False
except requests.exceptions.ConnectionError:
    print('N%d - %s - Proxy ConnectionError\n' % (threads.get_counter(),proxy_ip))
    return False

Вывод:

N10 - {'https': 'https://x.xxx.xx.xxx:1080'} - Proxy ProxyError
N10 - {'https': 'https://x.xxx.xx.xxx:1080'} - Proxy ProxyError
N10 - {'https': 'https://x.xxx.xx.xxx:1080'} - Proxy ProxyError
..............
N20 - {'https': 'https://x.xxx.xx.xxx:1080'} - Proxy ProxyError
N20 - {'https': 'https://x.xxx.xx.xxx:1080'} - Proxy ProxyError
N20 - {'https': 'https://x.xxx.xx.xxx:1080'} - Proxy ProxyError
...........

Почему выводится общее количество потоков из первого потока?Как я должен увеличивать правильный путь, чтобы он печатал возрастающие числа, увеличенные на 1?Спасибо!

1 Ответ

0 голосов
/ 18 октября 2018

В вашем коде run_counter является глобальной переменной.К тому времени, когда вы используете его, он был изменен созданием всех ваших потоков.Вам нужно хранить значение где-то, что является постоянным для экземпляра потока, который вы собираетесь использовать.Я бы вероятно подошел бы к этому примерно так:

class Worker(thread):
  _ids = count()

  def __init__(self):
    self.id = next(self._ids)

Тогда где-нибудь в вашем коде прокси вы можете сделать что-то вроде getCurrentThead().id.

...