importsubprocessimporttimeimportthreadingimportjsonfrom functools importwrapsfrom queue importQueue, Empty
THREAD_POOL_SIZE= 18
defcreate_ip():
with open('ip.txt', 'a+', encoding='utf-8') as f:for i in range(20):
f.write('127.0.0.{}\n'.format(i))defwrapper(func):
@wraps(func)def _timmer(*args, **kwargs):
start_time=time.time()
func(*args, **kwargs)
finish_time= time.time() -start_timeprint('共耗时{:.2f}秒'.format(finish_time))return_timmerdefrun_ping(ip):
ret_dic={}
result= subprocess.run('ping -n 1 -w 1 {}'.format(ip),
shell=True,
stdout=subprocess.DEVNULL)
result_code=result.returncode
ret_dic[ip]=result_codereturnjson.dumps(ret_dic)defprint_ping(ret):
ret_dic=json.loads(ret)for ip, ret_code inret_dic.items():if ret_code !=0:
with open('result.txt', 'a+', encoding='utf-8') as f:
f.write('{} 网络不通 {}\n'.format(
ip,
time.strftime('%Y-%m-%d %X')
))print('{} is offline'.format(ip))defworker(work_queue, result_queue):whileTrue:try:
ip= work_queue.get(block=False)exceptEmpty:break
else:try:
result=run_ping(ip)exceptException as e:
result_queue.put(e)else:
result_queue.put(result)finally:
work_queue.task_done()
@wrapperdefmain():print('正在网络检查,请稍候......')
work_queue=Queue()
result_queue=Queue()
with open('ip.txt') as f:for ip inf:
ip=ip.strip()
work_queue.put(ip)
threads=[
threading.Thread(target=worker, args=(work_queue, result_queue))for _ inrange(THREAD_POOL_SIZE)
]for thread inthreads:
thread.start()
work_queue.join()whilethreads:
threads.pop().join()while notresult_queue.empty():
result=result_queue.get()ifisinstance(result, Exception):raiseresult
print_ping(result)print('检查完毕!')if __name__ == '__main__':#create_ip()
main()