11.python併發入門(part2 threading模塊的基本使用)

1、在使用python多線程以前,你須要知道的。python

python的多線程中,實現併發是沒有問題的,可是!!是沒法實現真正的並行的。
多線程

這是由於python內部有個GIL鎖(全局解釋器鎖),這個鎖限制了在同一時刻,同一個進程中,只能有一個線程被運行!!!併發


2、threading模塊的基本使用方法。python2.7

可使用它來建立線程。有兩種方式來建立線程。ide

一、經過繼承Thread類,重寫它的run方法。函數

二、建立一個threading.Thread對象,在它的初始化函數__init__中將可調用對象做爲參數傳入。線程


三、接下來演示下這兩種建立線程對象的方法。對象

  1. 經過繼承Thread類的方式建立線程。繼承

#!/usr/local/bin/python2.7進程

# -*- coding:utf-8 -*-

import threading

import  time

class Mythread(threading.Thread):

    def __init__(self,num):

        threading.Thread.__init__(self)

        self.num = num

    def run(self):

        print "running number %s" %(self.num)

        time.sleep(3)

t1 = Mythread(1111111)

t2 = Mythread(2222222)

t1.start()    #調用線程對象的start方法,類中的run方法就會被執行!!!!

t2.start()

print "ending"


   2.建立一個threading.Thread對象,在實例化對象時調用構造方法來建立線程。

    

import threading

import  time

def print_num(num):

    print "running num is %s" %(num)

    time.sleep(3)

    print "running num is %s over!!!!" %(num)

if __name__ == "__main__":

    t1 = threading.Thread(target=print_num,args=(111111,))  #建立線程對象

    t2 = threading.Thread(target=print_num,args=(222222,)) #建立線程對象。

    t1.start()  #運行線程對象

    t2.start()

    print "ending"


#當前執行的python程序是一個主線程,在程序中執行的兩個線程就是子線程。




3、關於線程對象的一些經常使用方法。

  1. join()執行了線程的join方法後,在子線程運行結束以前,父線程會被一直阻塞。

import threading

import  time

def listen_music(name):

    print "begin listenning to %s.%s" %(name,time.ctime())

    time.sleep(3)

    print "end listenning time %s" %(time.ctime())

def play_game(name):

    print "play %s time %s " %(name,time.ctime())

    time.sleep(8)

    print "end playing"

thread_list = []

t1 = threading.Thread(target=listen_music,args=("mirrorcle world",))

t2 = threading.Thread(target=play_game,args=("Virtual stalker",))

t1.start()

t1.join()   #當t1沒有執行完以前,父線程會被阻塞,直到t1執行結束後,主線程(主程序)的代碼纔會繼續執行。

t2.start()

t2.join()  #當t2沒有執行完以前,父線程會被阻塞,直到t2執行結束後主線程(主程序)的代碼纔會繼續執行。

print "ending......."


   2.setdeamon()設置守護線程。

首先先來了解下守護線程的概念。

咱們用python寫的程序,在運行的過程當中,會開啓一個主線程,若是這個主線程開啓了一個子線程,主線程和子線程會兵分兩路,分別運行。

默認狀況下,當咱們的python程序運行結束,準備退出的時候,會校驗子線程是否運行完畢,若是子線程沒有運行完畢,主線程會等待子線程運行完畢後,在退出,這是默認狀況。

假如,咱們如今有一種需求,只須要主線程運行結束後,無論子線程是否運行結束,都要和主線程一塊兒結束,這就是守護線程的概念。

import threading

import  time

def listen_music(name):

    print "begin listenning to %s.%s" %(name,time.ctime())

    time.sleep(3)

    print "end listenning time %s" %(time.ctime())

def play_game(name):

    print "play %s time %s " %(name,time.ctime())

    time.sleep(8)

    print "end playing"

thread_list = []

t1 = threading.Thread(target=listen_music,args=("mirrorcle world",))

t2 = threading.Thread(target=play_game,args=("Virtual stalker",))

t1.setDaemon(True)  #守護線程必定要設置在start以前!!!

t1.start()

t2.setDaemon(True)

t2.start()

print "ending......."


運行結果:

begin listenning to mirrorcle world.Thu May 11 10:26:23 2017

play Virtual stalker time Thu May 11 10:26:23 2017 

ending.......

從結果中能夠看出兩個線程的內容並無被執行完!主線程執行結束後,子線程也跟着結束了!


4、關於線程對象的一些其餘方法。

isAlive() 用來判斷一個線程是否處於活動狀態。

getName() 返回這個線程的線程名稱。

setName()設置一個線程的名稱。


threading 模塊提供的一些函數:

threading.currentThread()返回當前線程對象。

threading.enumerate()  將當前python程序中正在運行的線程對象,以列表的形式返回。

threading.activeCount() 返回當前運行的線程數量。

相關文章
相關標籤/搜索