2016-01-25 3 views
2

Я хотел бы запустить функцию асинхронно в Python, вызывая функцию повторно с фиксированным интервалом времени. This Java-класс имеет функциональность, похожую на то, что я хочу. Я надеялся на что-то в python:Задачи расписания с фиксированной скоростью с многопроцессорной обработкой 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 похоже, но запрашивает решение в процессе. Я хочу многопроцессорное решение async.

ответ

0

Это одно из возможных решений. Одно из предостережений заключается в том, что func должен возвращаться быстрее, чем скорость, иначе его обычно называют так часто, как скорость, и если он когда-либо будет быстрее, он будет назначен быстрее, чем скорость, пока он настигнет. Этот подход, похоже, много работает, но опять же параллельное программирование часто бывает жестким. Я был бы признателен за второй взгляд на код, чтобы убедиться, что у меня нет тупика в ожидании.

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() 
Смежные вопросы