使用 Python 多处理以固定速率安排任务
Schedule Tasks at Fixed Rate with Python Multiprocessing
我想 运行 在 Python 中异步调用一个函数,以固定的时间间隔重复调用该函数。 This java class 的功能与我想要的类似。我希望在 python 中得到一些东西,比如:
pool = multiprocessing.Pool()
pool.schedule(func, args, period)
# other code to do while that runs in the background
pool.close()
pool.join()
是否有提供类似功能的软件包?我更喜欢简单轻便的东西。
如何在 python 中实现此功能?
这 post 类似,但需要一个进程中的解决方案。我想要一个多进程异步解决方案。
这是一种可能的解决方案。一个警告是 func 需要比 rate 快 return ,否则它不会像 rate 那样频繁地被调用,如果它变得更快,它将比 rate 更快地被调度,同时它赶上了。这种方法看起来工作量很大,但并行编程通常也很困难。我希望再次查看代码以确保我没有在某处等待死锁。
import multiprocessing, time, math
def func():
print('hello its now {}'.format(time.time()))
def wrapper(f, period, event):
last = time.time() - period
while True:
now = time.time()
# returns True if event is set, otherwise False after timeout
if event.wait(timeout=(last + period - now)):
break
else:
f()
last += period
def main():
period = 2
# event is the poison pill, setting it breaks the infinite loop in wrapper
event = multiprocessing.Event()
process = multiprocessing.Process(target=wrapper, args=(func, period, event))
process.start()
# burn some cpu cycles, takes about 20 seconds on my machine
x = 7
for i in range(50000000):
x = math.sqrt(x**2)
event.set()
process.join()
print('x is {} by the way'.format(x))
if __name__ == '__main__':
main()
我想 运行 在 Python 中异步调用一个函数,以固定的时间间隔重复调用该函数。 This java class 的功能与我想要的类似。我希望在 python 中得到一些东西,比如:
pool = multiprocessing.Pool()
pool.schedule(func, args, period)
# other code to do while that runs in the background
pool.close()
pool.join()
是否有提供类似功能的软件包?我更喜欢简单轻便的东西。
如何在 python 中实现此功能?
这 post 类似,但需要一个进程中的解决方案。我想要一个多进程异步解决方案。
这是一种可能的解决方案。一个警告是 func 需要比 rate 快 return ,否则它不会像 rate 那样频繁地被调用,如果它变得更快,它将比 rate 更快地被调度,同时它赶上了。这种方法看起来工作量很大,但并行编程通常也很困难。我希望再次查看代码以确保我没有在某处等待死锁。
import multiprocessing, time, math
def func():
print('hello its now {}'.format(time.time()))
def wrapper(f, period, event):
last = time.time() - period
while True:
now = time.time()
# returns True if event is set, otherwise False after timeout
if event.wait(timeout=(last + period - now)):
break
else:
f()
last += period
def main():
period = 2
# event is the poison pill, setting it breaks the infinite loop in wrapper
event = multiprocessing.Event()
process = multiprocessing.Process(target=wrapper, args=(func, period, event))
process.start()
# burn some cpu cycles, takes about 20 seconds on my machine
x = 7
for i in range(50000000):
x = math.sqrt(x**2)
event.set()
process.join()
print('x is {} by the way'.format(x))
if __name__ == '__main__':
main()