程序執行緒: 同一程序中,資訊共享和通訊。訪問差異會導致結果不一致。
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不支援 後者...