我正试图创建一个类,该类的方法不能阻止执行(我想它被称为"非阻塞"(,但在给定的时间只能执行其中一个。
假设:
import time
import random
class Foo():
def do_stuff_a(self):
print("Start a")
time.sleep(0.5)
print("Finished a")
def do_stuff_b(self):
print("Start b")
time.sleep(0.5)
print("Finished b")
def do_other_stuff():
print("doing other stsuff")
foo = Foo()
for x in range(15):
time.sleep(0.1)
# These calls should be non-blocking
if random.randint(0,1) == 1:
foo.do_stuff_a()
else:
foo.do_stuff_b()
do_other_stuff()
do_stuff_a和do_stuffb不应该阻塞流,所以do_other_stuff((应该每0.1秒执行一次。此外,如果do_stuff_a和b中的任何一个仍在运行,则应跳过它们(即Foo类的方法不能并行运行,如果有一个正在运行,则只应跳过对其中任何一个的调用(而不是将其放入队列中以备稍后使用(。
有关于如何开始的指针朋友吗?
这就是我所想到的;我需要两个装饰器,一个用于管理方法的线程(工作良好(,另一个用于确保只执行一个方法,并在它正在运行时跳过调用(而不是将其留在队列中(
import time
import random
import threading
def thread(func):
def wrapper( self, *args, **kwargs):
th = threading.Thread(target=func,args=(self, *args))
th.start()
return wrapper
class Foo():
def __init__(self):
self.lock = threading.Lock()
def non_parallel(fun):
def wrapper( self, *args, **kwargs):
if self.lock.locked(): return
self.lock.acquire()
try:
fun( self , *args)
except ValueError as e:
print (e)
self.lock.release()
return wrapper
@thread
@non_parallel
def do_stuff_a(self):
print("Start an")
print("Finished an")
@thread
@non_parallel
def do_stuff_b(self):
print("Start bn")
time.sleep(1)
print("Finished bn")
def do_other_stuff():
print("doing other stsuffn")
foo = Foo()
for x in range(5):
time.sleep(0.1)
foo.do_stuff_a()
foo.do_stuff_b()
do_other_stuff()