Python 线程获取锁优先级

Python Thread Acquire Lock Prioritization

有没有办法将threading.lock移交给python中预先确定的线程。考虑以下示例:

import os, json
import threading
from threading import Lock, Thread
from time import sleep


class Export:

    def __init__(self):
        self.relative_path = "file.txt"
        self.special_lock  = Lock()

    def push(self, data):
        self.special_lock.acquire()
        if not os.path.exists(self.relative_path):
            open(self.relative_path, 'w').close()
        with open(self.relative_path, 'a') as fo:
            json.dump(data, fo)
        self.special_lock.release()

    def rarePrinting(self):
        while(True):
            export.push("Important")
            sleep(1)

    def commonPrinting(self):
        while(True):
            export.push("Not So Important")
            sleep(0.1)

export = Export()
t1 = threading.Thread(target=export.rarePrinting)
t2 = threading.Thread(target=export.commonPrinting)
t1.start()
t2.start()

t1 正在向文件写入一些比 t2 更重要的信息,但是,由于我的程序中没有正常退出,所以我不知道哪个线程会在获取时被阻塞。我只想保证所有获取的 t1 数据都写入文件,有没有办法在不声明另一个锁的情况下以这种方式确定线程的优先级?

使用优先级队列,它自己处理锁定。 rarePrintingcommonPrinting 只是将不同优先级的项目放入队列中。第三个线程负责从队列中获取下一个可用项目并将其添加到您的文件中。

from queue import PriorityQueue


class Export:

    def __init__(self):
        self.relative_path = "file.txt"
        self.jobs = PriorityQueue()

    def writer(self):
        with open(self.relative_path, 'a') as fo:
            while True:
                _, data = self.jobs.get()
                json.dump(data, fo)

    def rare_printing(self):
        while True:
            self.jobs.put((0, "Important"))
            sleep(1)

    def common_printing(self):
        while True:
            self.jobs.put((1, "So Important"))
            sleep(0.1)


export = Export()
t1 = threading.Thread(target=export.rare_printing)
t2 = threading.Thread(target=export.common_printing)
t3 = threading.Thread(target=export.writer)
t1.start()
t2.start()
t3.start()

所有三个线程对队列的访问权限相同,但是当 rare_printing 获得锁时,它添加到队列的任何内容都会先于 common_printing 之前添加的任何内容跳转。

这确实假设 writer 的速度足够快,可以比添加作业更快地删除作业,因此 rare_printing 不会使来自 common_printing 的作业处理不足。