python多线程--threading简单实现
threading模块
局域网IP扫描实例
# 单线程:
importsubprocess,time,threadinga=time.clock()withopen("check_ping.txt",'w')asf:foriinrange(1,20):my_ip=".".join(["192.163.37",str(i)])try:subprocess.check_call('ping-n1-w1%s'%(my_ip),shell=True)exceptsubprocess.CalledProcessError:passelse:f.write("%s可以ping通\n"%my_ip)b=time.clock()print(b)#总共花费8s多
# 多线程(一)创建 Thread 的实例,传给它一个函数
a=time.clock()defcheck_ping(IP,obj):try:subprocess.check_call('ping-n1-w1%s'%IP,shell=True)exceptsubprocess.CalledProcessError:passelse:obj.write("%s可以ping通\n"%IP)defmain():threads=[]withopen("check_ping_1.txt",'w')asf:foriinrange(1,20):my_ip=".".join(["192.163.37",str(i)])t=threading.Thread(target=check_ping,args=(my_ip,f))#Thread方法:实例化一个线程对象,把函数(target)和参数(args)传进去,然后返回Thread实例,这里并没有执行。threads.append(t)num=range(len(threads))foriinnum:threads[i].start()#执行线程的start方法,线程开始执行foriinnum:threads[i].join()#这行线程的join方法,等待线程结束,如果主进程不需要等待线程结束,可以不需要调用join方法。if__name__=='__main__':main()b=time.clock()print(b)#总共花费0.9s
# 多线程(二)创建 Thread 的实例,传给它一个可调用的类实例
a=time.clock()classThread_func:def__init__(self,func,args):self.func=funcself.args=argsdef__call__(self):#__call__方法:将类模拟成函数,实例化后的类再次实例化相当于执行了__call__方法。self.func(*self.args)defcheck_ping(IP,obj):try:subprocess.check_call('ping-n1-w1%s'%IP,shell=True)exceptsubprocess.CalledProcessError:passelse:obj.write("%s可以ping通\n"%IP)defmain():threads=[]withopen("check_ping_2.txt",'w')asf:foriinrange(1,20):my_ip=".".join(["192.163.37",str(i)])t=threading.Thread(target=Thread_func(check_ping,(my_ip,f)))#Thread_func实例化时已经传入了参数,所以Thread方法中就不用args来传参了。threads.append(t)num=range(len(threads))foriinnum:threads[i].start()foriinnum:threads[i].join()if__name__=='__main__':main()b=time.clock()print(b)#总共花费1
# 多线程(三)派生 Thread 的子类,并创建子类的实例
a=time.clock()classThread_func(threading.Thread):#继承Thread,调用更灵活。def__init__(self,func,args):threading.Thread.__init__(self)self.func=funcself.args=argsdefrun(self):#这里必须使用run方法,当线程开启后执行。self.func(*self.args)defcheck_ping(IP,obj):try:subprocess.check_call('ping-n1-w1%s'%IP,shell=True)exceptsubprocess.CalledProcessError:passelse:obj.write("%s可以ping通\n"%IP)defmain():threads=[]withopen("check_ping_3.txt",'w')asf:foriinrange(1,20):my_ip=".".join(["192.163.37",str(i)])t=Thread_func(check_ping,(my_ip,f))threads.append(t)num=range(len(threads))foriinnum:threads[i].start()foriinnum:threads[i].join()if__name__=='__main__':main()b=time.clock()print(b)#花费0.7
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。