python:如何进行定期非阻塞查找
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
函数时创建一个事件循环,如 A Bad Coroutine Example 中所述,但是如何调用 xxx
非阻塞?
PS。我正在使用 Python3.4 asyncio 的新功能(过去使用的是 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
请问如何定期 执行比周期性间隔花费更多时间执行的任务?
例如:
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
函数时创建一个事件循环,如 A Bad Coroutine Example 中所述,但是如何调用 xxx
非阻塞?
PS。我正在使用 Python3.4 asyncio 的新功能(过去使用的是 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