上篇說道 要用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
.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
.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
.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...