Python多執行緒

2021-07-30 03:39:38 字數 2558 閱讀 3105

#!/usr/bin/env python3

import time, threading, queue

#----------------多執行緒----------------

# 簡單多執行緒ex

defmethod1

(): count = 5

while count > 0:

print(time.ctime(time.time()))

print(threading.current_thread().name)

count-=1

t = threading.thread(target = method1 , name = 'method1thread')

t.start()

t.join()

print(threading.current_thread().name)

# lock

balance = 0

lock = threading.lock()

defchange_it

(n):

# 先存後取,結果應該為0:

global balance

balance = balance + n

balance = balance - n

defrun_thread

(n):

# 直接如下執行結果可能不為0

# for i in range(100000):

# change_it(n)

# 結果為0

for i in range(100000):

# 先要獲取鎖:

lock.acquire()

try:

change_it(n)

finally:

# 改完了一定要釋放鎖:

lock.release()

t1 = threading.thread(target=run_thread, args=(5,))

t2 = threading.thread(target=run_thread, args=(8,))

t1.start()

t2.start()

t1.join()

t2.join()

print(balance)

print(threading.enumerate())

''' 1.為什麼python死迴圈不會占用百分之百cpu n核cpu跑滿需要n個死迴圈:

因為python的執行緒雖然是真正的執行緒,但直譯器執行**時,有乙個gil鎖:global interpreter lock,任何python執行緒執行前,必須先獲得gil鎖,然後,每執行100條位元組碼,直譯器就自動釋放gil鎖,讓別的執行緒有機會執行。這個gil全域性鎖實際上把所有執行緒的執行**都給上了鎖,所以,多執行緒在python中只能交替執行,即使100個執行緒跑在100核cpu上,也只能用到1個核。

2.執行緒模組

threading.currentthread(): 返回當前的執行緒變數。

threading.enumerate(): 返回乙個包含正在執行的執行緒的list。正在執行指執行緒啟動後、結束前,不包括啟動前和終止後的執行緒。

threading.activecount(): 返回正在執行的執行緒數量,與len(threading.enumerate())有相同的結果。

除了使用方法外,執行緒模組同樣提供了thread類來處理執行緒,thread類提供了以下方法:

run(): 用以表示執行緒活動的方法。

start():啟動執行緒活動。

join([time]): 等待至執行緒中止。這阻塞呼叫執行緒直至執行緒的join() 方法被呼叫中止-正常退出或者丟擲未處理的異常-或者是可選的超時發生。

isalive(): 返回執行緒是否活動的。

getname(): 返回執行緒名。

setname(): 設定執行緒名。

'''# 執行緒優先順序佇列 queue

''' queue.qsize() 返回佇列的大小

queue.empty() 如果隊列為空,返回true,反之false

queue.full() 如果佇列滿了,返回true,反之false

queue.full 與 maxsize 大小對應

queue.get([block[, timeout]])獲取佇列,timeout等待時間

queue.get_nowait() 相當queue.get(false)

queue.put(item) 寫入佇列,timeout等待時間

queue.put_nowait(item) 相當queue.put(item, false)

queue.task_done() 在完成一項工作之後,queue.task_done()函式向任務已經完成的佇列傳送乙個訊號

queue.join() 實際上意味著等到隊列為空,再執行別的操作

'''queue = queue.queue(10)

queue.put(t1)

queue.put(t2)

print(queue.empty())

print(queue.qsize())

python多執行緒 python多執行緒

通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...

python多執行緒詳解 Python多執行緒詳解

前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...

python程式多執行緒 PYTHON多執行緒

在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...