2017-07-28 150 views
0
import threading 
from queue import Queue 



print_lock = threading.Lock() 
def job(worker): 
    with print_lock: 
     with open('messages.txt') as f: 
      for line in f: 
       print(line) 

def reader(): 
    while True: 
     worker = q.get() 
     job(worker) 
     q.task_done() 

q = Queue() 

for x in range(10): 
    t = threading.Thread(target=reader) 

    t.daemon = True 
    t.start() 


for worker in range(1): 
    q.put(worker) 

q.join() 

所以我想是每個線程讀取不同的信息,Python的多線程隊列

回答

0

你想太多的事情在同一代碼片段像1學習)多線程2)隊列數據結構3)線程同步機制4)鎖定等。

讓我只回答關於多線程。

在你的情況,每個線程讀取所有消息,因爲目標函數「job"被打開文件和讀取所有的數據和每一個線程調用該目標函數。

讓我簡化填充位。

  1. 你想讀在新的線程文件的每一行。 因此,而不是在每一個線程打開文件並讀取它,我們將打開文件一次,並把數據列表。
  2. 現在,每個線程會讀從列表中選擇一行並打印出來從列表中刪除該打印的行。
  3. 有一次,所有的數據被打印,仍然線程試圖讀取,我們將添加異常。

代碼:

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起訴。但爲了學習的目的,這很好。

+0

好,我幾乎得到了它 但隨着你的代碼的問題是,如果我需要閱讀10行我需要創建10個線程 我是什麼尋找soloution 即使我有10個消息,2個線程,他們需要讀取10條消息 –

+0

好感謝了很多幫助我 但我仍然沒有得到一個完美的答案 有了更新的代碼,只有一個線程讀取所有消息 這是我得到的同時輸出添加線名 哎 線程1 哎 線程1 哎 線程1 喲 線程1 哎 線程1 你好 線程1 因此,我認爲線程1讀所有消息 再次感謝 –

+0

請現在檢查我的更新代碼。我還添加了線程名稱。但我正在同時訪問這兩個線程。 –