2017-09-08 3 views
0

Je suis nouveau pour explorer comment faire cela en python. Ce que je veux faire est d'exécuter une fonction tous les jours ouvrables à un moment précis, par exemple, dire à 14h55, à seulement 5 minutes avant la fermeture du marché boursier en Chine. Cette fonction extrait certaines données d'une API d'alimentation de données boursières et effectue quelques calculs simples pour générer un signal (-1 signifie court, +1 signifie long, 0 signifie ne rien faire). Je n'envoie pas encore le signal pour faire un échange maintenant. Je sauve les signaux tous les jours dans un fichier localement. Ainsi, je pourrais être en mesure de recueillir les signaux pendant 2 semaines ou chaque fois que je me sens d'arrêter ce programmateur.python comment exécuter une fonction tous les jours à un moment précis, mais peut également être terminée

Je remarque que le module APScheduler est assez souvent suggéré. Mais je l'ai essayé, n'a pas trouvé un moyen de faire arrêter le planificateur 2 semaines après. Je trouve seulement des moyens de mettre en place un planificateur à exécuter, peut-être toutes les 10 minutes, mais il continue à exécuter une fonction spécifiée toutes les 10 minutes et ne peut pas être arrêté par programmation, mais seulement en appuyant sur Ctrl+C? Par exemple, je veux exécuter une fonction toutes les 10 minutes pour 6 fois, en APScheduler, je n'ai pas vu de toute façon de spécifier l'argument '6 fois'. Ou je veux exécuter une fonction toutes les 10 minutes jusqu'à 1 heure plus tard. Je n'ai pas vu l'argument '1 heure plus tard' ou '16:30' non plus. Comment faire?

Actuellement, je le fais de cette façon:

def test_timer(): 
    ''' 
    Uses datetime module. 
    ''' 
    running = 1 
    stop_time = datetime.now() + timedelta(seconds=60) 
    while running: 

     print('I\'m working...') 
     time.sleep(5) 
     running = datetime.now() < stop_time 

    print('Goodbye!') 

Modifié: J'utilise python 3.6 dans Windows 10.

+1

Si vous utilisez Linux un moyen facile serait d'utiliser une crontab qui viendra pour exécuter votre code lorsque vous en avez besoin – Squick

+0

@Squick Lol question ne comprend jamais la définition de 'OS' – dsgdfg

+1

@dsgdfg c'est pourquoi j'ai dit" si " – Squick

Répondre

0

On dirait un problème pour crontab sous Linux ou Planificateur de tâches dans Windows .

+0

A propos de mac os ?? – dsgdfg

+0

crontab est présent sur MacOS https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html – RedEyed

0

Essayez cet exemple

from datetime import datetime 

from apscheduler.schedulers.background import BackgroundScheduler 


def job_function(): 
    print("Hello World") 

sched = BackgroundScheduler() 

# Schedule job_function to be called every 1 second 
# FIXME: Do not forget to change end_date to actual date 
sched.add_job(job_function, 'interval', seconds=1, end_date="2017-09-08 12:22:20") 

sched.start() 

Mise à jour # 1

from apscheduler.schedulers.background import BackgroundScheduler 

def job_function(): 
    print("Hello World") 

# Here, you can generate your needed days 
dates = ["2017-09-08 13:30:20", "2017-09-08 13:31:20", "2017-09-08 13:32:20"] 
sched = BackgroundScheduler()      

for date in dates: 
    sched.add_job(job_function, "date", next_run_time=date) 

sched.start() 
+0

merci, je n'ai pas remarqué que je pourrais ajouter l'argument 'end_date' . Existe-t-il un moyen de spécifier le planificateur à exécuter tous les jours ouvrables? Ou courir pour 9 fois. – StayFoolish