在Python中通过threading模块定义和调用线程的方法
定义线程
最简单的方法:使用target指定线程要执行的目标函数,再使用start()启动。
语法:
classthreading.Thread(group=None,target=None,name=None,args=(),kwargs={})
group恒为None,保留未来使用。target为要执行的函数名。name为线程名,默认为Thread-N,通常使用默认即可。但服务器端程序线程功能不同时,建议命名。
#!/usr/bin/envpython3 #coding=utf-8 importthreading deffunction(i): print("functioncalledbythread{0}".format(i)) threads=[] foriinrange(5): t=threading.Thread(target=function,args=(i,)) threads.append(t) t.start() t.join()
执行结果:
$./threading_define.py
functioncalledbythread0 functioncalledbythread1 functioncalledbythread2 functioncalledbythread3 functioncalledbythread4
确定当前线程
#!/usr/bin/envpython3 #coding=utf-8 importthreading importtime deffirst_function(): print(threading.currentThread().getName()+str('isStarting\n')) time.sleep(3) print(threading.currentThread().getName()+str('isExiting\n')) defsecond_function(): print(threading.currentThread().getName()+str('isStarting\n')) time.sleep(2) print(threading.currentThread().getName()+str('isExiting\n')) defthird_function(): print(threading.currentThread().getName()+\ str('isStarting\n')) time.sleep(1) print(threading.currentThread().getName()+str('isExiting\n')) if__name__=="__main__": t1=threading.Thread(name='first_function',target=first_function) t2=threading.Thread(name='second_function',target=second_function) t3=threading.Thread(name='third_function',target=third_function) t1.start() t2.start() t3.start()
执行结果:
$./threading_name.py
first_functionisStarting second_functionisStarting third_functionisStarting third_functionisExiting second_functionisExiting first_functionisExiting
配合logging模块一起使用:
#!/usr/bin/envpython3 #coding=utf-8 importlogging importthreading importtime logging.basicConfig( level=logging.DEBUG, format='[%(levelname)s](%(threadName)-10s)%(message)s', ) defworker(): logging.debug('Starting') time.sleep(2) logging.debug('Exiting') defmy_service(): logging.debug('Starting') time.sleep(3) logging.debug('Exiting') t=threading.Thread(name='my_service',target=my_service) w=threading.Thread(name='worker',target=worker) w2=threading.Thread(target=worker)#usedefaultname w.start() w2.start() t.start()
执行结果:
$./threading_names_log.py[DEBUG](worker)Starting
[DEBUG](Thread-1)Starting [DEBUG](my_service)Starting [DEBUG](worker)Exiting [DEBUG](Thread-1)Exiting [DEBUG](my_service)Exiting
在子类中使用线程
前面我们的线程都是结构化编程的形式来创建。通过集成threading.Thread类也可以创建线程。Thread类首先完成一些基本上初始化,然后调用它的run()。run()方法会会调用传递给构造函数的目标函数。
#!/usr/bin/envpython3 #coding=utf-8 importlogging importthreading importtime exitFlag=0 classmyThread(threading.Thread): def__init__(self,threadID,name,counter): threading.Thread.__init__(self) self.threadID=threadID self.name=name self.counter=counter defrun(self): print("Starting"+self.name) print_time(self.name,self.counter,5) print("Exiting"+self.name) defprint_time(threadName,delay,counter): whilecounter: ifexitFlag: thread.exit() time.sleep(delay) print("%s:%s"%(threadName,time.ctime(time.time()))) counter-=1 #Createnewthreads thread1=myThread(1,"Thread-1",1) thread2=myThread(2,"Thread-2",2) #StartnewThreads thread1.start() thread2.start() print("ExitingMainThread")
执行结果:
$./threading_subclass.py
StartingThread-1 StartingThread-2 ExitingMainThread Thread-1:TueSep1511:03:212015 Thread-2:TueSep1511:03:222015 Thread-1:TueSep1511:03:222015 Thread-1:TueSep1511:03:232015 Thread-2:TueSep1511:03:242015 Thread-1:TueSep1511:03:242015 Thread-1:TueSep1511:03:252015 ExitingThread-1 Thread-2:TueSep1511:03:262015 Thread-2:TueSep1511:03:282015 Thread-2:TueSep1511:03:302015 ExitingThread-2