1. 程式人生 > >[Python]多執行緒入門

[Python]多執行緒入門

Python的多執行緒有兩種實現方法:

函式,執行緒類

1.函式

呼叫thread模組中的start_new_thread()函式來建立執行緒,以執行緒函式的形式告訴執行緒該做什麼

# -*- coding: utf-8 -*-
import thread
 
 
def f(name):
    #定義執行緒函式
    print "this is " + name
 
 
if __name__ == '__main__':
    thread.start_new_thread(f, ("thread1",))
    #用start_new_thread()呼叫執行緒函式和其他引數
    while 1:
        pass

不過這種方法暫時沒能找到其他輔助方法,連主執行緒等待都要用while 1這種方法解決。

2.執行緒類

呼叫threading模組,建立threading.Thread的子類來得到自定義執行緒類。

# -*- coding: utf-8 -*-
import threading
 
 
class Th(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.t_name = name
        #呼叫父類建構函式
 
    def run(self):
        #重寫run()函式,執行緒預設從此函式開始執行
        print "This is " + self.t_name
 
if __name__ == '__main__':
    thread1 = Th("Thread_1")
    thread1.start()
    #start()函式啟動執行緒,自動執行run()函式

threading.Thread類的可繼承函式:

getName() 獲得執行緒物件名稱

setName() 設定執行緒物件名稱

join() 等待呼叫的執行緒結束後再執行之後的命令

setDaemon(bool) 阻塞模式,True:父執行緒不等待子執行緒結束,False 等待,預設為False

isDaemon() 判斷子執行緒是否和父執行緒一起結束,即setDaemon()設定的值

isAlive() 判斷執行緒是否在執行

例項

import threading
import time
 
 
class Th(threading.Thread):
    def __init__(self, thread_name):
        threading.Thread.__init__(self)
        self.setName(thread_name)
 
    def run(self):
        print "This is thread " + self.getName()
        for i in range(5):
            time.sleep(1)
            print str(i)
        print self.getName() + "is over"

join()阻塞等待

if __name__ == '__main__':
    thread1 = Th("T1 ")
    thread1.start()
    #thread1.join()
    print "main thread is over"

不帶thread1.join(),得到如下結果:

This is thread T1 

main thread is over

0

1

2

T1 is over

不等待thread1完成,執行之後語句。

加了thread1.join(),得到如下結果:

This is thread T1

0

1

2

T1 is over

main thread is over

阻塞等待thread1結束,才執行下面語句

主執行緒等待

if __name__ == '__main__':
    thread1 = Th("T1 ")
    thread1.setDaemon(True)
    #要線上程執行之前就設定這個量
    thread1.start()
    print "main thread is over"

報錯:Exception in thread T1  (most likely raised during interpreter shutdown):

也就是主執行緒不等待子執行緒就結束了。

多個子執行緒

if __name__ == '__main__':
    for i in range(3):
        t = Th(str(i))
        t.start()
    print "main thread is over"

這裡的t可同時處理多個執行緒,即t為執行緒控制代碼,重新賦值不影響執行緒。

這裡奇怪的是,執行t.run()時,不會再執行其他執行緒。雖不明,還是用start()吧。暫且理解為start()是非阻塞並行的,而run是阻塞的。

執行緒鎖

threading提供執行緒鎖,可以實現執行緒同步。

import threading
import time
 
 
class Th(threading.Thread):
    def __init__(self, thread_name):
        threading.Thread.__init__(self)
        self.setName(thread_name)
 
    def run(self):
        threadLock.acquire()
        #獲得鎖之後再執行
        print "This is thread " + self.getName()
        for i in range(3):
            time.sleep(1)
            print str(i)
        print self.getName() + " is over"
        threadLock.release()
        #釋放鎖
 
 
if __name__ == '__main__':
    threadLock = threading.Lock()
    #設定全域性鎖
    thread1 = Th('Thread_1')
    thread2 = Th('Thread_2')
    thread1.start()
    thread2.start()

得到結果:

This is thread Thread_1

0

1

2

Thread_1 is over

This is thread Thread_2

0

1

2

Thread_2 is over

相關推薦

python 執行入門試驗

參考 https://www.cnblogs.com/yeayee/p/4952022.html 但這文章裡有 那個t.join() 在外面, 就能執行完 ,應該是錯的 最多就一個執行緒玩感覺   import threading def test_thread():

[Python]執行入門

Python的多執行緒有兩種實現方法: 函式,執行緒類 1.函式 呼叫thread模組中的start_new_thread()函式來建立執行緒,以執行緒函式的形式告訴執行緒該做什麼 # -*- coding: utf-8 -*- import thread d

python爬蟲入門八:程序/多執行緒 python佇列Queue Python多執行緒(2)——執行緒同步機制 python學習筆記——程序中共享記憶體Value & Array python程序 Python多程序 Python 使用multiprocessing 特別耗記

什麼是多執行緒/多程序 引用蟲師的解釋: 計算機程式只不過是磁碟中可執行的,二進位制(或其它型別)的資料。它們只有在被讀取到記憶體中,被作業系統呼叫的時候才開始它們的生命期。 程序(有時被稱為重量級程序)是程式的一次執行。每個程序都有自己的地址空間,記憶體,資料棧以及其它記錄其執行軌跡的輔助資料

Python執行程序和協程的例項講解

執行緒、程序和協程是什麼 執行緒、程序和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西 參考: 程序、執行緒、協程之概念理解 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。執

Python 執行 thread join() 的作用

原文地址 在 Python 的多執行緒程式設計中,在例項程式碼中經常有 thread1.join()這樣的程式碼。那麼今天咱們用實際程式碼來解釋一下 join 函式的作用。   join的原理就是依次檢驗執行緒池中的執行緒是否結束,沒有結束就阻塞直到執行緒結束,如果結束則跳轉執行下一

教你用 Python 執行爬京東商城商品評論(代理ip請閱讀上一篇)

爬蟲永不停息 最近改進上一篇的爬蟲,不爬豆瓣了,改爬一爬京東評論,先放幾張圖研究看看先。 研究了一下,發現商品的id就是連結.html前面的數字。我們把它複製貼上下拉 1,對上一篇的代表進行修改和新增 class Spider(): def

Python執行小例子

Python多執行緒小例子 1、在主執行緒中建立子執行緒 下面的程式碼一共建立了三個執行緒:主執行緒、coding 執行緒和music 執行緒,最後使用thread_list 裝載執行緒

初識python執行

1) 在python中如何建立一個執行緒物件? 如果你要建立一個執行緒物件,很簡單,只要你的類繼承threading.Thread,然後在__init__裡首先呼叫threading.Thread的__init__方法即可:   import threading

利用Python執行限制 http 真實請求時間或限制函式最大執行時間的裝飾器

  這段時間在製作一個爬蟲的時候發現了一個比較神奇的事情 python requests 包發起請求的時候設定 timeout 引數 竟然不起作用? what 你要弄啥么蛾子嘞,  後來各種找原因終於在別人的提醒下又看了下 requests 的文件才發

PYTHON——執行:同步鎖:Lock

一、先用一個例子說明沒有用鎖的時候,達到的效果錯誤: 1、例項(沒有鎖的情況): import time import threading # 沒有用鎖的 # 時候,出現多個執行緒拿到相同資源的現象。 # 如下例中,共享資源變數num=100,我們開100個執行緒,每個執行緒將資源變數num減1,按

PYTHON——執行:訊號量(Semaphore)

  訊號量也是一把鎖,用來控制執行緒併發數的。   BoundedSemaphore或Semaphore管理一個內建的計數 器,每當呼叫acquire()時-1,呼叫release()時+1。       計數器不能小於0,當計數器為 0時,acquire()將阻塞執行緒至同

PYTHON——執行:條件變數(Condition)

  條件變數(Condition)也是一把鎖,除了同步鎖的作用外,還具有線上程間通訊的功能。   有一類執行緒需要滿足條件之後才能夠繼續執行,Python提供了threading.Condition 物件用於條件變數執行緒的支援,它除了能提供RLock()或Lock()的方法外,還提供了 wait()、no

PYTHON——執行:佇列Queue資料結構

1、佇列模組簡介   佇列是一種資料結構,用於存放資料,類似列表。它是先進先出模式(FIFO模式),類似管道一般; 單執行緒不需要用到佇列Queue,它主要用在多執行緒之間的,Queue稱為多執行緒利器。 列表在多執行緒共享資源的話,與queue佇列比較,主要表現為列表在多執行緒中,資料不安全。多個執行

python執行獲取區域網內所有電腦IP

#coding = utf-8 import os,os.path import threading import time lock = threading.RLock() def action(ip): result = "ip.txt" return1 = os.sy

Python 執行 程序 協程 yield

python中多執行緒和多程序的最大區別是穩定性和效率問題 多程序互相之間不影響,一個崩潰了不影響其他程序,穩定性高 多執行緒因為都在同一程序裡,一個執行緒崩潰了整個程序都完蛋 多程序對系統資源開銷大,多執行緒對系統資源開銷小,所以這方面來說多執行緒會比多程序快一點點 關於執行

python執行程序、協程的使用

本文主要介紹多執行緒、多程序、協程的最常見使用,每個的詳細說明與介紹有時間會在以後的隨筆中體現。 一、多執行緒 1.python通過兩個標準庫thread和threading提供對執行緒的支援。thread提供了低級別的、原始的執行緒以及一個簡單的鎖。threading通過對thread模組

利用python執行實現區塊鏈paxos演算法解決使用者共識

本來是做python 開發的老闆最近讓做區塊鏈也沒有頭緒從網上找了點視訊看著照的敲了了下感覺是自己寫過最多的程式碼啦 怪我才疏學淺  哈哈哈-- import threading, socket, pickle, queue class Message(object): MS

Python 執行工具包 threading 的超簡單例子

筆者初學 Python,在程式設計中,遇到了多執行緒的問題,即需要一個程式中的幾部分同時執行。 例如:給一個後臺程式寫一個“心跳程序”,定時輸出訊號,以確認程式正常執行。 在網上搜索了下發現有不少帖子,但總感覺帖子中舉的例子不夠簡單和直觀,遂決定寫個自己覺得夠簡單直觀的例子。程式碼如

python 執行工內網攝像頭登陸

python 多執行緒多工內網攝像頭登陸 #coding=utf-8 import time import datetime import xlwt import xlrd from xlutils.copy import copy; import requests import so

python 執行佇列

我們常常目標具有多工,所以我們才多佇列,但是為了提高速度,常常採用多執行緒,所以多執行緒多佇列 #coding=utf-8 import Queue import threading import urllib2 import time from BeautifulSoup import