Python多线程队列

2024-05-08 23:20:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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()

所以我想要的是每个线程读取不同的消息


Tags: inimporttruelockforqueuedefwith
1条回答
网友
1楼 · 发布于 2024-05-08 23:20:17

您在同一个代码片段中尝试了太多东西需要学习,例如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()

输出:

^{pr2}$

注意:我知道不推荐使用global的sue。但对于学习目的来说这是好的。在

相关问题 更多 >

    热门问题