2017-10-13 10 views
4

J'ai un morceau de code Python que je veux convertir en Julia. Je le code python J'utilise le paquet schedule. Quel est l'équivalent dans Julia, j'ai regardé la partie "Tâches et Parallel Computing" dans la documentation Julia mais je ne trouve pas quelque chose de similaire. Le code en Python est:Quel est l'équivalent de Julia au paquet de planification de Python?

def main(): 
    schedule.every(0.25).seconds.do(read_modbus, 1, 1000, 100, 1) 
    while True: 
     schedule.run_pending() 
     time.sleep(0.05) 
+1

Quel est le cas d'utilisation exactement? c'est-à-dire, y a-t-il une raison pour laquelle vous ne pouvez pas juste 'tout vrai? println ("bonjour \ n"); sommeil (0,25); end' –

+1

Cela ne va pas aider, je ne sais pas combien de temps l'appel à la fonction read_modbus va prendre, mais je veux l'exécuter 4 fois par seconde. –

+0

Si vous essayez 'def read_modbus (* a): print (datetime.datetime.now()); time.sleep (0.19)' vous verrez que la fonction est appelée seulement environ 2 fois par seconde bien qu'il y ait de la place pour courir 4 fois. (Si vous changez 'schedule.every (0.25)' en 'schedule.every (0.001)' il sera appelé environ 4 fois!). Je pense que c'est parce que la prochaine exécution est prévue [** après le travail est fait **] (https://github.com/dbader/schedule/blob/master/schedule/__init__.py#L386) – Liso

Répondre

5

Est-ce un travail Timer? Cette forme de Timer appelle votre fonction dans un Task, vous devez donc céder le contrôle de votre boucle principale de temps en temps pour permettre l'exécution de la tâche de temporisation. Vous pouvez céder en appelant yield, sleep, wait, ou faire des E/S, ici je montre attendre sur le minuteur.

tstart = time() 
ncalls = 0 
read_modbus() = (global ncalls+=1;@show (time()-tstart)/ncalls,ncalls) 
t=Timer((timer)->read_modbus(),0,0.25) 

while true 
    wait(t) # wait for timer to go off 
    println("mainloop $ncalls") 
end 
+0

Oui! :) Ceci 'read_modbus() = (ncalls global, tstart; println ((temps() - tstart)/(ncalls! = 0? Ncalls: 1)," ", appelle); sleep (0.24); ncalls + = 1) ; tstart = time(); ncalls = 0; t = Timer ((timer) -> read_modbus(), 0,0.25); 'fonctionne comme prévu. Mais je ne m'attendais pas à ce que read_modbus() = (ncalls globaux, tstart; println ((temps() - tstart)/(ncalls! = 0? Ncalls: 1), "", ncalls); sleep (0.5) ; ncalls + = 1); tstart = time(); ncalls = 0; t = Timer ((timer) -> read_modbus(), 0,0.25); 'convergera vers 0.75s ... – Liso

+0

Merci, cela fonctionne parfaitement! –

+0

Je cherchais aussi un scheduler Julia ... (pour remplacer Python APScheduler dans mon cas) voir https://discourse.julialang.org/t/julia-cron-like-event-scheduler/6899/2 – scls

1

Je remarqué qu'une bibliothèque de programmation pour Julia avait disparu, alors je l'ai écrit un https://github.com/scls19fr/ExtensibleScheduler.jl

Voici un exemple de base en utilisant un programmateur de blocage.

using ExtensibleScheduler 

function read_modbus(p1, p2, p3, p4) 
    println("Read_modbus with $p1 $p2 $p3 $p4") 
end 

sched = BlockingScheduler() 

add(sched, Action(read_modbus, 1, 1000, 100, 1), Trigger(Dates.Millisecond(250))) 

run(sched) 

Althought, ceci est un travail en cours, mais contributers sont les bienvenus.

Actuellement (2017-12), il existe seulement une implémentation d'un planificateur bloquant mais il devrait être possible d'ajouter le multithreading.