你想太多的事情在同一代碼片段像1學習)多線程2)隊列數據結構3)線程同步機制4)鎖定等。
讓我只回答關於多線程。
在你的情況,每個線程讀取所有消息,因爲目標函數「job"
被打開文件和讀取所有的數據和每一個線程調用該目標函數。
讓我簡化填充位。
- 你想讀在新的線程文件的每一行。 因此,而不是在每一個線程打開文件並讀取它,我們將打開文件一次,並把數據列表。
- 現在,每個線程會讀從列表中選擇一行並打印出來從列表中刪除該打印的行。
- 有一次,所有的數據被打印,仍然線程試圖讀取,我們將添加異常。
代碼:
import threading
import sys
#Global variable list for reading file data
global file_data
file_data = []
#Create lock
lock = threading.Lock()
def reader():
while len(file_data) != 0:
print threading.currentThread().getName() + " --- "
try:
lock.acquire()
#Get one line from list and print it
a = file_data.pop()
print a
except:
#Once data is not present, let's print exception message
print "------------------------"
print "No data present in file"
sys.exit()
lock.release()
#Read data from file and put it into list
with open("messages.txt") as fh:
file_data = fh.readlines()
for x in range(2):
name = "Thread_"+str(x)
t = threading.Thread(name=name,target=reader)
t.start()
輸出:
C:\Users\dinesh\Desktop>python demo.py
Thread_0 --- Thread_1 ---
Each thread read each message
Thread_1 --- I am great
Thread_0 --- How Are you ?
Thread_1 --- Grey
Thread_0 --- Hey
Thread_1 --- Dinesh
Thread_0 --- Hello
------------------------
No data present in file
C:\Users\dinesh\Desktop>
C:\Users\dinesh\Desktop>
注:我知道是不建議的global
起訴。但爲了學習的目的,這很好。
好,我幾乎得到了它 但隨着你的代碼的問題是,如果我需要閱讀10行我需要創建10個線程 我是什麼尋找soloution 即使我有10個消息,2個線程,他們需要讀取10條消息 –
好感謝了很多幫助我 但我仍然沒有得到一個完美的答案 有了更新的代碼,只有一個線程讀取所有消息 這是我得到的同時輸出添加線名 哎 線程1 哎 線程1 哎 線程1 喲 線程1 哎 線程1 你好 線程1 因此,我認爲線程1讀所有消息 再次感謝 –
請現在檢查我的更新代碼。我還添加了線程名稱。但我正在同時訪問這兩個線程。 –