python实现多线程的方式及多条命令并发执行
一、概念介绍
Thread是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入.
Thread模块是比较底层的模块,Threading模块是对Thread做了一些包装的,可以更加方便的被使用。
另外在工作时,有时需要让多条命令并发的执行,而不是顺序执行。
二、代码样例
#!/usr/bin/python #encoding=utf-8 #Filename:thread-extends-class.py #直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的class里 importthreading importtime classThreadImpl(threading.Thread): def__init__(self,num): threading.Thread.__init__(self) self._num=num defrun(self): globaltotal,mutex #打印线程名 printthreading.currentThread().getName() forxinxrange(0,int(self._num)): #取得锁 mutex.acquire() total=total+1 #释放锁 mutex.release() if__name__=='__main__': #定义全局变量 globaltotal,mutex total=0 #创建锁 mutex=threading.Lock() #定义线程池 threads=[] #创建线程对象 forxinxrange(0,40): threads.append(ThreadImpl(100)) #启动线程 fortinthreads: t.start() #等待子线程结束 fortinthreads: t.join() #打印执行结果 printtotal
#!/usr/bin/python #encoding=utf-8 #Filename:thread-function.py #创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行 importthreading importtime defthreadFunc(num): globaltotal,mutex #打印线程名 printthreading.currentThread().getName() forxinxrange(0,int(num)): #取得锁 mutex.acquire() total=total+1 #释放锁 mutex.release() defmain(num): #定义全局变量 globaltotal,mutex total=0 #创建锁 mutex=threading.Lock() #定义线程池 threads=[] #先创建线程对象 forxinxrange(0,num): threads.append(threading.Thread(target=threadFunc,args=(100,))) #启动所有线程 fortinthreads: t.start() #主线程中等待所有子线程退出 fortinthreads: t.join() #打印执行结果 printtotal if__name__=='__main__': #创建40个线程 main(40)
#!/usr/bin/python #encoding=utf-8 #Filename:put_files_hdfs.py #让多条命令并发执行,如让多条scp,ftp,hdfs上传命令并发执行,提高程序运行效率 importdatetime importos importthreading defexecCmd(cmd): try: print"命令%s开始运行%s"%(cmd,datetime.datetime.now()) os.system(cmd) print"命令%s结束运行%s"%(cmd,datetime.datetime.now()) exceptException,e: print'%s\t运行失败,失败原因\r\n%s'%(cmd,e) if__name__=='__main__': #需要执行的命令列表 cmds=['ls/root', 'pwd',] #线程池 threads=[] print"程序开始运行%s"%datetime.datetime.now() forcmdincmds: th=threading.Thread(target=execCmd,args=(cmd,)) th.start() threads.append(th) #等待线程运行完毕 forthinthreads: th.join() print"程序结束运行%s"%datetime.datetime.now()
以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。