在Python中通過(guò)threading模塊定義和調(diào)用線程的方法
定義線程
最簡(jiǎn)單的方法:使用target指定線程要執(zhí)行的目標(biāo)函數(shù),再使用start()啟動(dòng)。
語(yǔ)法:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
group恒為None,保留未來(lái)使用。target為要執(zhí)行的函數(shù)名。name為線程名,默認(rèn)為Thread-N,通常使用默認(rèn)即可。但服務(wù)器端程序線程功能不同時(shí),建議命名。
#!/usr/bin/env python3
# coding=utf-8
import threading
def function(i):
print ("function called by thread {0}".format(i))
threads = []
for i in range(5):
t = threading.Thread(target=function , args=(i,))
threads.append(t)
t.start()
t.join()
執(zhí)行結(jié)果:
$ ./threading_define.py
function called by thread 0 function called by thread 1 function called by thread 2 function called by thread 3 function called by thread 4
確定當(dāng)前線程
#!/usr/bin/env python3
# coding=utf-8
import threading
import time
def first_function():
print (threading.currentThread().getName()+ str(' is Starting \n'))
time.sleep(3)
print (threading.currentThread().getName()+ str( ' is Exiting \n'))
def second_function():
print (threading.currentThread().getName()+ str(' is Starting \n'))
time.sleep(2)
print (threading.currentThread().getName()+ str( ' is Exiting \n'))
def third_function():
print (threading.currentThread().getName()+\
str(' is Starting \n'))
time.sleep(1)
print (threading.currentThread().getName()+ str( ' is Exiting \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()
執(zhí)行結(jié)果:
$ ./threading_name.py
first_function is Starting second_function is Starting third_function is Starting third_function is Exiting second_function is Exiting first_function is Exiting
配合logging模塊一起使用:
#!/usr/bin/env python3
# coding=utf-8
import logging
import threading
import time
logging.basicConfig(
level=logging.DEBUG,
format='[%(levelname)s] (%(threadName)-10s) %(message)s',
)
def worker():
logging.debug('Starting')
time.sleep(2)
logging.debug('Exiting')
def my_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) # use default name
w.start()
w2.start()
t.start()
執(zhí)行結(jié)果:
$ ./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
在子類中使用線程
前面我們的線程都是結(jié)構(gòu)化編程的形式來(lái)創(chuàng)建。通過(guò)集成threading.Thread類也可以創(chuàng)建線程。Thread類首先完成一些基本上初始化,然后調(diào)用它的run()。run()方法會(huì)會(huì)調(diào)用傳遞給構(gòu)造函數(shù)的目標(biāo)函數(shù)。
#!/usr/bin/env python3
# coding=utf-8
import logging
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Starting " + self.name)
print_time(self.name, self.counter, 5)
print ("Exiting " + self.name)
def print_time(threadName, delay, counter):
while counter:
if exitFlag:
thread.exit()
time.sleep(delay)
print ("%s: %s" %(threadName, time.ctime(time.time())))
counter -= 1
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print ("Exiting Main Thread")
執(zhí)行結(jié)果:
$ ./threading_subclass.py
Starting Thread-1 Starting Thread-2 Exiting Main Thread Thread-1: Tue Sep 15 11:03:21 2015 Thread-2: Tue Sep 15 11:03:22 2015 Thread-1: Tue Sep 15 11:03:22 2015 Thread-1: Tue Sep 15 11:03:23 2015 Thread-2: Tue Sep 15 11:03:24 2015 Thread-1: Tue Sep 15 11:03:24 2015 Thread-1: Tue Sep 15 11:03:25 2015 Exiting Thread-1 Thread-2: Tue Sep 15 11:03:26 2015 Thread-2: Tue Sep 15 11:03:28 2015 Thread-2: Tue Sep 15 11:03:30 2015 Exiting Thread-2
- Python+threading模塊對(duì)單個(gè)接口進(jìn)行并發(fā)測(cè)試
- python threading和multiprocessing模塊基本用法實(shí)例分析
- Python 多線程,threading模塊,創(chuàng)建子線程的兩種方式示例
- Python多線程模塊Threading用法示例小結(jié)
- Python線程threading模塊用法詳解
- Python threading模塊condition原理及運(yùn)行流程詳解
- Python 多線程之threading 模塊的使用
- Python多線程編程之threading模塊詳解
- python threading模塊的使用指南
- Python常用模塊之threading和Thread模塊及線程通信
相關(guān)文章
python對(duì)數(shù)組進(jìn)行排序,并輸出排序后對(duì)應(yīng)的索引值方式
今天小編就為大家分享一篇python對(duì)數(shù)組進(jìn)行排序,并輸出排序后對(duì)應(yīng)的索引值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
PyQt6中自定義浮點(diǎn)型滑塊類的實(shí)現(xiàn)
在PyQt6中,滑塊是常用的用戶界面元素之一,用于選擇數(shù)值范圍,本文主要介紹了PyQt6中自定義浮點(diǎn)型滑塊類的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程)
這篇文章主要介紹了PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
python基于celery實(shí)現(xiàn)異步任務(wù)周期任務(wù)定時(shí)任務(wù)
這篇文章主要介紹了python基于celery實(shí)現(xiàn)異步任務(wù)周期任務(wù)定時(shí)任務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

