Python threading. Here are two, simple examples that get threading to work on python:
This is an example of a “fastping” style program using Pool and map:
#!/usr/bin/python2 from multiprocessing import Pool import os,sys import subprocess import fileinput devnull = open(os.devnull,'w') threads = 128 ip_list = [ip.strip() for ip in fileinput.input()] #Reads files from argv[1:], or stdin if no argv present def fast_ping(ip): ret_value = subprocess.Popen(['ping','-c 1','-W 1',ip],stdout=devnull).wait() if ret_value == 0: sys.stdout.write("\t{0}\n".format(ip)) #Print for threading return (0,ip) else: return (1,ip) pool = Pool(threads) #I am going to have a 16-threaded application print('Up:') ip_status = pool.map(fast_ping,ip_list) #This mapping is the secret sauce. You define the function, and the ITERABLE of arguments that will be provided to each thread. print('Down:') for ip in ip_status: if ip[0]: print('\t{0}'.format(ip[1]))
Here is the same program using threading. The advantage here is it is simpler to provide multiple arguments.
#!/usr/bin/python2 import os, subprocess, sys import fileinput from threading import Thread from Queue import Queue threads = 128 queue = Queue() ip_status = [] ips = [ip.strip() for ip in fileinput.input()] devnull = open(os.devnull,'w') def fast_ping(ping_index,q): while True: ip = q.get() ret_value = subprocess.call(["ping","-c 1","-W 1",ip], stdout=devnull, stderr=devnull) if ret_value == 0: sys.stdout.write("\t{0}\n".format(ip)) ip_status.append((0,ip)) else: ip_status.append((1,ip)) q.task_done() print('Up:') for index in range(threads): worker = Thread(target=fast_ping, args=(index, queue)) #Notice I pass two args here. Just to show it works worker.setDaemon(True) worker.start() for ip in ips: queue.put(ip) queue.join() print('Down:') for ip in ip_status: if ip[0]: print('\t{0}'.format(ip[1]))
Here’s sample output from both of them, demonstrating both usages (and that they do the same thing):
root@code-red:/com/testbed# time ./fastping_pool ips Up: 8.8.4.4 8.8.8.8 Down: 10.0.0.1 1.2.3.4 6.8.5.2 4.4.4.4 5.5.1.2 65.196.35.165 real 0m1.285s user 0m0.136s sys 0m0.012s root@code-red:/com/testbed# time cat ips | ./fastping_threading Up: 8.8.4.4 8.8.8.8 Down: 4.4.4.4 5.5.1.2 6.8.5.2 10.0.0.1 1.2.3.4 65.196.35.165 real 0m1.042s user 0m0.016s sys 0m0.008s
Python – Threading and Reading from stdin