在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