背景:說(shuō)到多線(xiàn)程锁施,我們會(huì)想到的是:異步編程墩剖、同步(鎖)挑胸、共享變量痒筒、線(xiàn)程池等等,那么Python里面多線(xiàn)程是如何實(shí)現(xiàn)的茬贵?
1.新建一個(gè)線(xiàn)程
import threading
// target是線(xiàn)程需要執(zhí)行的方法簿透,args是線(xiàn)程方法需要傳入的參數(shù)
t1 = threading.Thread(target=processservice.biz_monitor_process, args=(src.globals.xspace_im_monitored_process, 5))
t1.setDaemon(true) //設(shè)置線(xiàn)程為守護(hù)線(xiàn)程
t1.start()
im_page = xspaceimpageservice.XSpaceImPageService()
// 無(wú)需傳參
t3 = threading.Thread(target=im_page.biz_servicer_chat)
t3.start()
t3.join()
2.線(xiàn)程同步(鎖)
- 線(xiàn)程同步常見(jiàn)的一種實(shí)現(xiàn)方式是在競(jìng)爭(zhēng)資源上添加鎖,保證同一時(shí)間最多只有一個(gè)線(xiàn)程在訪問(wèn)競(jìng)爭(zhēng)資源
- Python的threading 模塊提供的線(xiàn)程同步對(duì)象包括:Lock闷沥、RLock萎战、Condition、Event舆逃、Semaphore等蚂维。
以Lock為例:
- 創(chuàng)建鎖對(duì)象
mutex = thread.allocate_lock()
mutex = threading.Lock()
- 加鎖
這里timeout的作用是加鎖的超時(shí)時(shí)間戳粒,如果超過(guò)超時(shí)時(shí)間,可以通過(guò)返回值判斷加鎖是否成功
mutex.acquire([timeout])
- 釋放鎖
mutex.release()
- 范例代碼:
// 創(chuàng)建一個(gè)lock實(shí)例
mutex = threading.Lock()
// 加鎖
if mutex.acquire(1):
// 線(xiàn)程互斥執(zhí)行的代碼
num = num+1
msg = self.name+' set num to '+str(num)
print msg
// 釋放鎖
mutex.release()
3.線(xiàn)程池
如果需要使用線(xiàn)程池的話(huà)虫啥,需要首先安裝threadpool包
pip install threadpool
范例code
// 實(shí)例一個(gè)線(xiàn)程數(shù)為poolsize的線(xiàn)程池
pool = threadpool.ThreadPool(poolsize)
// makeRequests傳入需要線(xiàn)程執(zhí)行的方法蔚约,以及參數(shù),最后的callback非必選涂籽,默認(rèn)為空苹祟,創(chuàng)建線(xiàn)程任務(wù)
requests = pool.makeRequests(some_callable, list_of_args, callback)
// 這里用map函數(shù),將線(xiàn)程任務(wù)放到線(xiàn)程池中
map(pool.putRequest,request_list)
// wait方法是一個(gè)阻塞方法评雌,用于等待線(xiàn)程池中所有線(xiàn)程執(zhí)行完后返回
pool.wait()