python 基礎 執行緒 和 程序

2021-09-29 01:14:53 字數 4438 閱讀 6643

程序執行緒: 同一程序中,資訊共享和通訊。訪問差異會導致結果不一致。

python程式中由global interpreter lock(gil),主迴圈中要求只能有乙個控制線程執行。

import time

import threading

# threading.thread() 是執行緒

# 每個執行緒的內容, 等待n秒

defworker

(n):

print

('函式執行開始於:{} '

.format

(time.ctime())

) time.sleep(n)

print

('函式執行結束於:{}, 執行緒名:{}'

.format

(time.ctime(

),threading.current_thread(

).name)

)# 繼承threading.thread,重寫run(): 執行緒執行介面

class

mythread

(threading.thread):

def__int__

(self, func, args)

: threading.thread.__init__(self)

self.func = func

self.args = args

# start 啟動

defrun

(self)

:# 解包

self.func(

*self.args)

# 主函式,生成兩個執行緒物件,入執行緒池threads,.start() 開始, .join() 守護執行緒,主函式等子執行緒全部執行後在結束。

defmain()

:print

('[主函式執行開始於:{}]'

.format

(time.ctime())

) threads =

t1 = mythread(worker,(4

,)) t2 = mythread(worker,(2

,))for t in threads:

t.start(

)for t in threads:

t.join(

)print

('[主函式執行結束於:{}]'

.format

(time.ctime())

)if __name__ ==

'__mian__'

: main(

)

import threading

import queue

import time

import random

# 生成者, 產生隨機數到 data_queue 佇列中, data_queue.put()

defproducer

(data_queue)

:for i in

range(5

):time.sleep(

0.5)

item = random.randint(1,

100)

data_queue.put(item)

print

("{} 在佇列中放入資料項 {}"

.format

(threading.current_thread(

).name, item)

)# 消費者,從佇列中取出乙個數,data_queue.task_done()

defconsumer

(data_queue)

:while

true

:try

: item = data_queue.get(timeout=3)

print

('{} 從佇列中移除了'

.format

(threading.current_thread(

).name)

)except queue.empty:

break

else

: data_queue.task_done(

)# 主函式,生成4個執行緒到執行緒池,2個生成者,2個消費者。

defmain()

: q = queue.queue(

) threads =

p = threading.thread(target=producer, args=

(q,)

) p.start(

)for i in

range(2

):c = threading.thread(target=consumer, args=

(q,)

)for t in threads:

t.start(

)for t in threads:

t.join(

) q.join()

main(

)

同步原語(鎖)

import time

import threading

import random

eggs =

lock = threading.lock(

)def

put_egg

(n, lst)

:# lock.acquire()

with lock:

for i in

range(1

, n+1)

: time.sleep(random.randint(0,

2))# lock.release()

defmain()

: threads =

for i in

range(3

):t = threading.thread(target= put_egg, args=(5

, eggs)

)for t in threads:

t.start(

)for t in threads:

t.join(

)print

(eggs)

main(

)

程序,執行緒,線性執行速度對比。

import time

import concurrent.futures

numbers =

list

(range(1

,7))

defcount

(n):

for i in

range

(10000000):

i +=

1return i*n

defworker

(x):

result = count(x)

print

('數字:{}的計算結果為:{}'

.format

(x, result)

)# 順序執行

defsequential_excution()

: start_time = time.clock(

)for i in numbers:

worker(i)

print(.

format

(time.clock(

)-start_time)

)# 執行緒執行

defthread_execution()

: start_time = time.clock(

)with concurrent.futures.threadpoolexecutor(max_workers=5)

as excuter:

for i in numbers:

excuter.submit(worker, i)

print(.

format

(time.clock(

)-start_time)

)# 多程序 程序池執行

defprocess_excution()

: start_time = time.clock(

)with concurrent.futures.processpoolexecutor(max_workers=1)

as excuter:

for i in numbers:

excuter.submit(worker, i)

print(.

format

(time.clock(

)-start_time)

)if __name__ ==

'__main__'

:# sequential_excution()

# thread_execution()

process_excution(

)

Python 執行緒和程序

一 什麼是執行緒 1 執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。每個程序至少包含乙個執行緒.二 什麼是程序 1 乙個程序就是乙個程式的例項,每個程序裡面...

python執行緒和程序

執行緒 計算機能夠進行排程的最小單位 乙個程序可以包含多個執行緒,執行緒共享程序資源 多執行緒併發 上下文程序就像乙個工作的房間 記憶體 以及房間裡工作需要的資源 i o啊,網絡卡啊 執行緒相當於工作的人 所有的在同乙個程序中的執行緒是共享一塊記憶體空間 pid 唯一的程序識別符號 each pro...

python程序和執行緒

爬蟲開發過程中 程序和執行緒的概念是非常重要的 提高爬蟲的 工作效率 打造分布式爬蟲 都離不開程序和執行緒的身影 多程序 多執行緒 協程 分布式程序等四個方面 使用os模組中的fork方法 使用multiprocessing模組 前者僅僅適用unix linux作業系統 對windows不支援 後者...