1. 程式人生 > >Python筆記——多執行緒實現的兩種方式及讓多條命令併發執行

Python筆記——多執行緒實現的兩種方式及讓多條命令併發執行

一 概念介紹

        Thread 是threading模組中最重要的類之一,可以使用它來建立執行緒。有兩種方式來建立執行緒:一種是通過繼承Thread類,重寫它的run方法;另一種是建立一個threading.Thread物件,在它的初始化函式(__init__)中將可呼叫物件作為引數傳入.

        Thread模組是比較底層的模組,Threading模組是對Thread做了一些包裝的,可以更加方便的被使用。

        另外在工作時,有時需要讓多條命令併發的執行, 而不是順序執行.

二 程式碼樣例

#!/usr/bin/python
# encoding=utf-8
# Filename: thread-extends-class.py
# 直接從Thread繼承,建立一個新的class,把執行緒執行的程式碼放到這個新的 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
    # 建立鎖
    mutex = threading.Lock()
    
    #定義執行緒池
    threads = []
    # 建立執行緒物件
    for x in xrange(0, 40):
        threads.append(ThreadImpl(100))
    # 啟動執行緒
    for t in threads:
        t.start()
    # 等待子執行緒結束
    for t in threads:
        t.join()  
    
    # 列印執行結果
    print total

#!/usr/bin/python
# encoding=utf-8
# Filename: thread-function.py
# 建立執行緒要執行的函式,把這個函式傳遞進Thread物件裡,讓它來執行

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
    # 建立鎖
    mutex = threading.Lock()
    
    #定義執行緒池
    threads = []
    # 先建立執行緒物件
    for x in xrange(0, num):
        threads.append(threading.Thread(target=threadFunc, args=(100,)))
    # 啟動所有執行緒
    for t in threads:
        t.start()
    # 主執行緒中等待所有子執行緒退出
    for t in threads:
        t.join()  
        
    # 列印執行結果
    print total
 
 
if __name__ == '__main__':
    # 建立40個執行緒
    main(40)


#!/usr/bin/python
# encoding=utf-8
# Filename: put_files_hdfs.py
# 讓多條命令併發執行,如讓多條scp,ftp,hdfs上傳命令併發執行,提高程式執行效率
import datetime
import os
import threading

def execCmd(cmd):
    try:
        print "命令%s開始執行%s" % (cmd,datetime.datetime.now())
        os.system(cmd)
        print "命令%s結束執行%s" % (cmd,datetime.datetime.now())
    except Exception, e:
        print '%s\t 執行失敗,失敗原因\r\n%s' % (cmd,e)

if __name__ == '__main__':
    # 需要執行的命令列表
    cmds = ['ls /root',
           'pwd',]
    
    #執行緒池
    threads = []
    
    print "程式開始執行%s" % datetime.datetime.now()

    for cmd in cmds:
        th = threading.Thread(target=execCmd, args=(cmd,))
        th.start()
        threads.append(th)
         
    # 等待執行緒執行完畢
    for th in threads:
        th.join()
         
    print "程式結束執行%s" % datetime.datetime.now()