![](/img/trans.png)
[英]Schedule periodic non-blocking tasks in python without dealing with the GIL
[英]python: how-to do a periodic non-blocking lookup
您能否建议如何定期执行比定期间隔花费更多时间的任务?
例如:
def lookup():
# do some lookups, retrieve info, let's assume it takes 60sec to complete
msg = {'abc':123}
time.sleep(60)
return msg
class Publisher(object):
def __init__(self):
self._TIMEIT = 0
self._INTERVAL = 5
self._counter = 0
def xxx():
t_start = time.time()
msg = lookup()
# do something with the value returned
save_msg_to_db(msg)
self._counter += 1
t_end = time.time()
self._TIMEIT = int(math.ceil(t_end - t_start))
def run():
while True:
# let's do the lookup every 5sec, but remember that lookup takes 60sec to complete
time.sleep(self._INTERVAL)
# the call to xxx() should be non-blocking
xxx()
但是run
方法负责安排定期任务,并且在进行迭代时,调用函数xxx
时不应阻塞它。
我正在考虑在每次对xxx
函数的调用上创建一个事件循环,如不良协同程序示例中所述,但是如何对xxx
非阻塞调用呢?
PS。 我正在使用asyncio新增的Python3.4(过去使用过gevent),不确定我是否在这里问某事。
因此, lookup
将创建一个异步循环,比如说需要60秒才能完成。 但是,在run
方法中有一个无限循环运行,我希望它每5秒执行一次查找,换句话说,我想(1)调用查找函数的频率与 (2)多长时间无关需要查找才能完成
由于您的lookup()
主要是I / O密集型的,因此您可以将xxx()
方法作为线程运行,并且可以很好地工作(为简洁起见,代码缩短了):
import threading
import time
class Publisher(object):
def __init__(self):
self._INTERVAL = 5
self._counter = 0
self._mutex = threading.Lock()
def xxx(self):
msg = lookup()
save_msg_to_db(msg)
with self._mutex: # make sure only one thread is modifying counter at a given time
self._counter += 1
def run(self):
while True:
time.sleep(self._INTERVAL)
t = threading.Thread(target=self.xxx)
t.setDaemon(True) # so we don't need to track/join threads
t.start() # start the thread, this is non-blocking
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.