【发布时间】:2019-06-23 01:15:27
【问题描述】:
我的应用程序有一个运行时间长、CPU 消耗量大的线程(下面是 Runner 类的示例),而线程池需要快速构建一个页面然后返回它(例如 Builder 类)。 Runner 正在进行后台媒体编码,对时间不敏感。 Builder.build_stuff() 运行速度很快并且对时间敏感,所以如果Builder 试图运行,我想阻止Runner 开始任何新工作。
我最初使用单个threading.Lock() 来阻止Runner.do_work,但这限制了多个Builders 一次运行。我在下面做了一个简化的例子来展示我想出的策略;但我不是 100% 确定这是最好的解决方案,或者没有现有的结构可以做到这一点。
import threading
runner = Runner()
"""Thread that is always running"""
def run():
while True:
runner.do_work()
running_work = threading.Thread(target=run).start()
"""Builders are created for a short duration by an outside pool of threads"""
class Builder:
def __del__(self):
runner.outside_release()
def __init__(self):
runner.outside_acquire()
self.build_stuff()
def build_stuff(self):
"""Do build some stuff here"""
return """thing that was built"""
class Runner:
def __init__(self):
self.building_flag = 0
self.building_lock = threading.Condition(threading.Lock())
def outside_acquire(self):
with runner.building_lock:
runner.building_flag += 1
self.build_stuff()
def outside_release(self):
with runner.building_lock:
runner.building_flag -= 1
runner.building_lock.notify()
def do_work(self):
with self.building_lock:
while self.building_flag:
self.building_lock.wait()
"""Do some work here"""
【问题讨论】:
标签: python python-3.x multithreading thread-safety locking