繁体   English   中英

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跳到先前common_printing添加的任何内容之前。

这确实假定writer足够快地以比可以添加的速度快地除去作业,从而rare_printing不会使rare_printing处理工作common_printing

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM