Возможно, я попытаюсь использовать threading
для чего-то, чего я не должен был бы, если да, пожалуйста, позвольте я знаю.
Я сделал небольшой пример моего кода, поэтому проще понять, что мне нужно.
У меня есть входные IP-адреса пользователей, затем я пинг IP-адреса, которые они ввели. Я хотел бы выполнить ping x количество IP-адресов за раз, в этом примере его 4.
Проблема в том, что каждый поток обрабатывает все 4 IP-адреса. Я бы хотел, чтобы 1 поток был ping IP 1, затем другой для ping IP 2, а затем, если поток 1 поймал с IP 1, он переместится к следующему доступному IP-адресу (так что если поток 2 взял IP 3, то поток 1 подхватит IP4).
Таким образом, я могу выполнить ping все IP-адреса за ~ 2 секунды, а не ~ 4 секунды.
Сообщите мне, если вам нужно больше деталей.
pre>Выход:
import threading
#prints out "pinging IP" for each IP in ip_list
def _ping(ip_list):
for objects in ip_list:
print ("Pinging ip: " + objects)ip_list = []#ask user for IP address, appends to ip_list
for x in range (0,4):
ip = str(input("please enter ip: "))
ip_list.append(ip)#calls function _ping with threading.
if __name__ == '__main__':
numOfThreads = 2
threadList = []
for i in range (numOfThreads):
t = threading.Thread(target=_ping, args=(ip_list[0:4],))
t.start()
threadList.append(t)
Очередь - хорошая структура данных, которая поможет решить эту проблему. Очереди представляют собой списки "первый-в-первом" (FIFO), что означает, что элементы удаляются из него в том порядке, в котором они помещаются в него. Модуль
queue
в стандартной библиотеке Python реализует потокобезопасную очередь, именно то, что вам нужно.Вы можете включить основной поток в IP-адрес всех IP-адресов, затем каждый поток будет удалите из него. Это приведет к удалению элемента, так что потоки получат IP-адрес, если он еще не обработан. Это потребует лишь незначительной модификации вашего существующего кода.
Самое важное изменение заключается в том, что вам нужно каким-то образом отключить потоки, когда больше нет элементов для обработки. Наиболее распространенный способ сделать это - добавить "дозорный", некоторый объект, который уведомляет поток о завершении работы.
None
- это общий выбор, так же как и пустая строка.Предложите использовать
threadpool
, сначала используйтеpip install threadpool
для установки модуля, затем выполните следующий код: