Очередь выбирает только последний элемент - PullRequest
0 голосов
/ 03 ноября 2019

Итак, я работаю над сайд-проектом, и у меня возникла проблема. Я пытаюсь создать очередь с потоками. Он продолжает использовать последний элемент в очереди, а не другие элементы. Если в очереди 5 элементов, она будет выполнять функцию 5 раз с последним элементом в очереди

with open('ipport.txt', 'r') as p:
    ports = [x.strip().split(":", 1) for x in p]

for ip, port in ports:
    q.put((ip, port))



def portchecker():
    print(f"{ip}:{port}")
def worker():
    while True:
        item = q.get()
        if item is None:
            break
        PortChecker(item)
        q.task_done()
threads = []
for i in range(ThreadInput):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)

q.join()

for i in range(2):
    q.put(None)
for t in threads:
    t.join()

Я потратил бесчисленные часы в поисках своей проблемы, но я просто не знаючто я делаю не такОн должен получить элемент из списка IP: PORT, и выполнить функцию, распечатать вывод.

1 Ответ

0 голосов
/ 03 ноября 2019

Ваша ошибка в том, что вы не ставите экземпляр Queue на рабочий в качестве аргумента. Ваш код должен выглядеть следующим образом:

from threading import Thread, current_thread
from queue import Queue


def worker(q):
    while True:
        element = q.get()
        if element == "STOP":  # I like using "STOP" more than None, It is more explicit
            break
        print("{}: {} _ {}".format(current_thread().getName(), element[0], element[1]))


if __name__ == '__main__':
    _items = [(k, k,) for k in range(100)]  # create input for threads
    q = Queue()
    thread_number = 4
    for i in range(thread_number):
        Thread(target=worker, args=(q,),).start()  # put queue object in Thread as argument
    for i in _items:
        q.put(i)
    for i in range(thread_number):
        q.put("STOP")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...