簡體   English   中英

Python 多線程隊列

[英]Python Multithreading Queue

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

所以我想要的是每個線程讀取不同的消息,

隊列是線程安全的

所以,不需要線程鎖

您嘗試在同一代碼片段中學習太多東西,例如 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 但是為了學習目的,這是很好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM