你想太多的事情在同一代码片段像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读所有消息 再次感谢 –
请现在检查我的更新代码。我还添加了线程名称。但我正在同时访问这两个线程。 –