2016-09-25 3 views
0

Ich muss einige Sellerie Aufgaben in zufälligen Zeiten laufen - jeder Lauf sollte zu einer neuen zufälligen Zeit sein - die Zufallszahl sollte jeden Lauf generiert werden.
, was ich in der Vergangenheit getan hat, ist:
Sellerie Aufgaben in zufälligen Zeiten

"my_task": { 
    "task": "path.to.my_task", 
    "schedule": crontab(minute='*/%s' % rand), 
}, 
rand = random(1,12) 

aber dieser Code ist nicht gut für meine Bedürfnisse anu mehr:
1. Ich unterschiedliche benötigen (wie möglich mit random0 Nummer für jeden Mieter
2. andere Nummer wird jedes Mal, und zwar nicht nur auf settings.py Last (einmal) erzeugt

ich versuchte Zeitplan zu überschreiben, wie in THIS Antwort erklärt, aber es hat nicht funktioniert, ist es besser so? bin ich etwas fehlt?

Dank (zum Beispiel in Mietern A wird die Aufgabe nach 8, und in Mietern B die Aufgabe ausgeführt werden soll, auf 4 und am Tag danach bei 20 usw. bei 23 und dem Tag läuft)!

======== Update ====

nach der großen Antwort, die ich bekam, habe ich Option, um meine Aufgabe und verarbeitet es in apply_asynch Verfahren als suggested-
.

"my-task": { # deprecated task 
       "task": "mdm_sync.tasks.test_task", 
       # "schedule": new_sc(), 
       "schedule": crontab(minute=39, hour=11), 
       "options": { 
        "eta": datetime.utcnow() 
       } 
}, 


entry.options["eta"] = datetime.datetime.utcnow() + datetime.timedelta(seconds=random(3600,12*3600) 

funktioniert super!

Antwort

1

konfrontiert ich ein ähnliches Problem, bei dem ich facebook wie Benachrichtigungen generieren musste zwischen Zufalls Benutzer bei zufälligen Zeitintervall auch das gleiche wie Sie tun i

Zunächst wurde die random Funktion um den minute Wert zu crontab zu geben. Aber, wie settings.py und celery.py werden nur einmal geladen, wenn Sie python manage.py runserver getroffen, dass Zufallsfunktion nur einmal ausgeführt wird und somit, dass Zufallswert wird nur einmal ausgewählt, sagt 5 Minuten oder 7 Minuten, aber dann dieser Zufallswert wird verwendet für Wiederholen Sie die Aufgabe alle 5 oder 7 Minuten, damit die Aufgaben regelmäßig wiederholt werden.

Also, was Sie tun müssen, ist, dass anstelle der Zeitpunkt der Aufgabe der Definition in settings.py oder celery.py Sie müssen die Funktion/Methode in Ihrer tasks.py rekursiv Anruf.Aber der Schlüssel ist, dass Sie die gleiche Funktion rekursiv und asynchron aufrufen müssen, und während es asynchron aufrufen, müssen Sie einen Parameter Verzögerung deren Wert übergeben wird unter Verwendung der Zufallsfunktion

berechnet werden siehe meine tasks.py ->https://github.com/ankushrgv/notification/blob/master/apps/notifications/tasks.py

Und

celery.py ->https://github.com/ankushrgv/notification/blob/master/config/celery.py

Sie müssen python manage.py shell und dann die Funktion/Methode von dort nur einmal aufrufen, um die Rekursion zu starten.

so etwas wie

`myFunction().apply_async()` 

In meinem Fall verwendet es

`CreateNotifications().apply_async()` 
+0

ich mit Ihrer Lösung bearbeitet, die Frage zu sein. Vielen Dank! – amichib

+0

Gerne helfen. :) –

Verwandte Themen