Python线程获取锁定优先级

时间:2019-08-28 15:16:41

标签: python python-multithreading

有没有办法将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数据都写入文件中,有没有办法在不声明另一个锁的情况下以这种方式对线程进行优先级排序?

1 个答案:

答案 0 :(得分:2)

使用优先级队列,该队列可处理自身的锁定。 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的作业处理速度不足。