2016-01-25 2 views
2

Je voudrais exécuter une fonction de manière asynchrone en Python, en appelant la fonction plusieurs fois à un intervalle de temps fixe. This Java classe a des fonctionnalités similaires à ce que je veux. J'espérais quelque chose en python comme:Planifier des tâches à taux fixe avec le multitraitement Python

pool = multiprocessing.Pool() 
pool.schedule(func, args, period) 
# other code to do while that runs in the background 
pool.close() 
pool.join() 

Y a-t-il des paquets qui fournissent des fonctionnalités similaires? Je préférerais quelque chose de simple et léger.

Comment pourrais-je implémenter cette fonctionnalité en python?

Cette post est similaire, mais demande une solution en cours de traitement. Je veux une solution asynchrone multi-processus.

Répondre

0

Voici une solution possible. Une mise en garde est que func doit retourner plus vite que le taux, sinon il ne sera pas appelé aussi souvent que le taux et si jamais il devient plus rapide, il sera programmé plus vite que le taux pendant qu'il rattrape. Cette approche semble beaucoup de travail, mais là encore, la programmation parallèle est souvent difficile. J'apprécierais un deuxième regard sur le code pour m'assurer que je n'ai pas une impasse attendant quelque part.

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()