Python 多執行緒學習03

2021-07-08 12:34:10 字數 4360 閱讀 2594

上篇說道 要用lock 來解決 ,執行緒爭搶的問題。

於是我修改了**:

#coding:utf8

import threading,random

import time

class

cut(threading.thread):

def__init__

(self,content):

threading.thread.__init__(self)

self.content = content

defrun(self):

global alock

alock.acquire()

while(len(content) > 0):

time.sleep(random.randrange(0,2))

tmp = content.pop()

print self.getname(), tmp

alock.release()

if'__main__' == __name__:

filename = "easy.txt"

f = open(filename)

content = f.read().split("\n")

content = content[:-1]

print content

global alock

alock = threading.lock()

workman = cut(content)

workman2 = cut(content)

workman.start()

workman2.start()

f.close()

在main中 定義了 alock 這個lock變數,然後 獲取 list長度,和 pop 操作兩邊進行 加鎖和釋放 ,來看執行結果。

[[email protected]

.4.100 thread]# python work.py

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

thread-1

9thread-1

8thread-1

7thread-1

6thread-1

5thread-1

4thread-1

3thread-1

2thread-1

1thread-1

0[[email protected]

.4.100 thread]#

這個結果,確實沒有競爭了, 但執行緒2 完全沒有存在感。

回去檢視**,發現 執行緒1 在獲取了鎖之後,直到全部處理完,才把鎖放開了, 所以執行緒2 根本沒有表現的機會。

這就是用鎖用的過猛了。 鎖不應該用這麼大的範圍,否則, 你的多執行緒,又變成單執行緒了。

下面再修改程式 ,把跟 list 相關的操作分離出來 。

**如下:

#coding:utf8

import threading,random

import time

class

cut(threading.thread):

def__init__

(self,content):

threading.thread.__init__(self)

self.content = content

defrun(self):

global alock

while

true:

alock.acquire()

length = len(content)

if length >0:

tmp = content.pop()

alock.release()

else:

alock.release()

break

time.sleep(random.randrange(0,2))

print self.getname(), tmp

if'__main__' == __name__:

filename = "easy.txt"

f = open(filename)

content = f.read().split("\n")

content = content[:-1]

print content

global alock

alock = threading.lock()

workman = cut(content)

workman2 = cut(content)

workman.start()

workman2.start()

f.close()

執行的結果像下面這樣:

[[email protected]

.4.100 thread]# python work.py

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

thread-1

9thread-2

7thread-1

8thread-1

5thread-2

6thread-1

4thread-2

3thread-2

1thread-2

0thread-1

2[[email protected]

.4.100 thread]#

這次結果就沒有報錯,而且也可以兩個執行緒一起執行,我多試了幾次,也都沒有異常。

觀察輸出,發現,這次的結果並不是 9,8,7,6,5.. 這樣順序列印出來的, 這是因為每個執行緒會有乙個隨機的處理時間 。 比較符合實際的情況。

沒有漏掉,也沒有重複, 符合要求。

我隨後試了 啟動4個執行緒來工作的情況

#coding:utf8

import threading,random

import time

class

cut(threading.thread):

def__init__

(self,content):

threading.thread.__init__(self)

self.content = content

defrun(self):

global alock

while

true:

alock.acquire()

length = len(content)

if length >0:

tmp = content.pop()

alock.release()

else:

alock.release()

break

time.sleep(random.randrange(0,2))

print self.getname(), tmp

if'__main__' == __name__:

filename = "easy.txt"

f = open(filename)

content = f.read().split("\n")

content = content[:-1]

print content

global alock

alock = threading.lock()

workman = cut(content)

workman2 = cut(content)

workman3 = cut(content)

workman4 = cut(content)

workman.start()

workman2.start()

workman3.start()

workman4.start()

f.close()

程式執行結果為:

[[email protected]

.4.100 thread]# python work.py

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

thread-1

9thread-2

7thread-2

5thread-2

4thread-4

2thread-4

1thread-4

0thread-1

8thread-3

6thread-2

3[[email protected]

.4.100 thread]#

上面的結果,符合要求。 當執行緒較多時, 不必像我一樣定義這麼多變數, 應該使用list之類的資料結構。

07 多執行緒03

1.中斷執行緒的執行 當乙個執行緒執行的時候,另乙個執行緒可以呼叫對應的thread的物件的 interrupt 方法來中斷它 public void interrupt 2.判斷執行緒是否中斷 public boolean isinterrupted 3.多執行緒資源協調問題 多執行緒同時去操作乙...

Java多執行緒03

生產者檢查倉庫是否已經滿了,如果沒滿,將生產產品 如果倉庫已滿,停止生產產品。消費者檢查倉庫是否已空,倉庫不空,消費者消費產品 若空,消費者停止消費產品。分析 這是乙個執行緒同步問題,生產者和消費者共享同乙個資源,並且生產者和消費者之間相互依賴,互為條件。對於生產者,沒有生產產品之前,要通知消費者等...

Python多執行緒學習

一 建立執行緒 1 通過thread模組中的start new thread func,args 建立執行緒 在eclipse pydev中敲出以下 coding utf 8 import thread def run thread n for i in range n print i thread...