python實(shí)現(xiàn)多線程的方式及多條命令并發(fā)執(zhí)行
一、概念介紹
Thread 是threading模塊中最重要的類之一,可以使用它來(lái)創(chuàng)建線程。有兩種方式來(lái)創(chuàng)建線程:一種是通過(guò)繼承Thread類,重寫它的run方法;另一種是創(chuàng)建一個(gè)threading.Thread對(duì)象,在它的初始化函數(shù)(__init__)中將可調(diào)用對(duì)象作為參數(shù)傳入.
Thread模塊是比較底層的模塊,Threading模塊是對(duì)Thread做了一些包裝的,可以更加方便的被使用。
另外在工作時(shí),有時(shí)需要讓多條命令并發(fā)的執(zhí)行, 而不是順序執(zhí)行。
二、代碼樣例
#!/usr/bin/python # encoding=utf-8 # Filename: thread-extends-class.py # 直接從Thread繼承,創(chuàng)建一個(gè)新的class,把線程執(zhí)行的代碼放到這個(gè)新的 class里 import threading import time class ThreadImpl(threading.Thread): def __init__(self, num): threading.Thread.__init__(self) self._num = num def run(self): global total, mutex # 打印線程名 print threading.currentThread().getName() for x in xrange(0, int(self._num)): # 取得鎖 mutex.acquire() total = total + 1 # 釋放鎖 mutex.release() if __name__ == '__main__': #定義全局變量 global total, mutex total = 0 # 創(chuàng)建鎖 mutex = threading.Lock() #定義線程池 threads = [] # 創(chuàng)建線程對(duì)象 for x in xrange(0, 40): threads.append(ThreadImpl(100)) # 啟動(dòng)線程 for t in threads: t.start() # 等待子線程結(jié)束 for t in threads: t.join() # 打印執(zhí)行結(jié)果 print total
#!/usr/bin/python # encoding=utf-8 # Filename: thread-function.py # 創(chuàng)建線程要執(zhí)行的函數(shù),把這個(gè)函數(shù)傳遞進(jìn)Thread對(duì)象里,讓它來(lái)執(zhí)行 import threading import time def threadFunc(num): global total, mutex # 打印線程名 print threading.currentThread().getName() for x in xrange(0, int(num)): # 取得鎖 mutex.acquire() total = total + 1 # 釋放鎖 mutex.release() def main(num): #定義全局變量 global total, mutex total = 0 # 創(chuàng)建鎖 mutex = threading.Lock() #定義線程池 threads = [] # 先創(chuàng)建線程對(duì)象 for x in xrange(0, num): threads.append(threading.Thread(target=threadFunc, args=(100,))) # 啟動(dòng)所有線程 for t in threads: t.start() # 主線程中等待所有子線程退出 for t in threads: t.join() # 打印執(zhí)行結(jié)果 print total if __name__ == '__main__': # 創(chuàng)建40個(gè)線程 main(40)
#!/usr/bin/python
# encoding=utf-8
# Filename: put_files_hdfs.py
# 讓多條命令并發(fā)執(zhí)行,如讓多條scp,ftp,hdfs上傳命令并發(fā)執(zhí)行,提高程序運(yùn)行效率
import datetime
import os
import threading
def execCmd(cmd):
try:
print "命令%s開(kāi)始運(yùn)行%s" % (cmd,datetime.datetime.now())
os.system(cmd)
print "命令%s結(jié)束運(yùn)行%s" % (cmd,datetime.datetime.now())
except Exception, e:
print '%s\t 運(yùn)行失敗,失敗原因\r\n%s' % (cmd,e)
if __name__ == '__main__':
# 需要執(zhí)行的命令列表
cmds = ['ls /root',
'pwd',]
#線程池
threads = []
print "程序開(kāi)始運(yùn)行%s" % datetime.datetime.now()
for cmd in cmds:
th = threading.Thread(target=execCmd, args=(cmd,))
th.start()
threads.append(th)
# 等待線程運(yùn)行完畢
for th in threads:
th.join()
print "程序結(jié)束運(yùn)行%s" % datetime.datetime.now()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python中可以發(fā)生異常自動(dòng)重試庫(kù)retrying
這篇文章主要介紹了python中可以發(fā)生異常自動(dòng)重試庫(kù)retrying,retrying是一個(gè)極簡(jiǎn)的使用Python編寫的庫(kù),主題更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-06-06
實(shí)例講解Python腳本成為Windows中運(yùn)行的exe文件
在本篇文章里小編給大家分享了關(guān)于Python腳本成為Windows中運(yùn)行的exe文件的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-01-01
Python實(shí)現(xiàn)可自定義大小的截屏功能
這篇文章主要介紹了Python實(shí)現(xiàn)可自定義大小的截屏功能,結(jié)合實(shí)例形式分析了Python針對(duì)指定范圍的截圖、保存等功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01

