2017-07-28 230 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

请现在检查我的更新代码。我还添加了线程名称。但我正在同时访问这两个线程。 –