Add meaningfull process titles with currently running task name (#57)

* Customize process names (in ps/top) and add task name in logs

* Increase severity of reincarnate log messages and add task name

* Document setproctitle optional dependency

Co-authored-by: Marc Sabatier <37879561+msabatier@users.noreply.github.com>
Co-authored-by: Stan Triepels <1939656+GDay@users.noreply.github.com>
This commit is contained in:
msabatier
2023-01-26 02:21:56 +01:00
committed by GitHub
parent 650c3b1524
commit 17c1609f10
8 changed files with 1399 additions and 1242 deletions

View File

@@ -33,6 +33,7 @@ from django_q.conf import (
get_ppid,
logger,
psutil,
setproctitle,
resource,
)
from django_q.humanhash import humanize
@@ -59,6 +60,8 @@ class Cluster:
signal.signal(signal.SIGINT, self.sig_handler)
def start(self) -> int:
if setproctitle:
setproctitle.setproctitle(f"qcluster {current_process().name} {self.name}")
# Start Sentinel
self.stop_event = Event()
self.start_event = Event()
@@ -217,13 +220,13 @@ class Sentinel:
db.connections.close_all()
if process == self.monitor:
self.monitor = self.spawn_monitor()
logger.error(
logger.critical(
_("reincarnated monitor %(name)s after sudden death")
% {"name": process.name}
)
elif process == self.pusher:
self.pusher = self.spawn_pusher()
logger.error(
logger.critical(
_("reincarnated pusher %(name)s after sudden death")
% {"name": process.name}
)
@@ -233,15 +236,30 @@ class Sentinel:
if process.timer.value == 0:
# only need to terminate on timeout, otherwise we risk destabilizing
# the queues
task_name = ""
if psutil:
try:
process_name = psutil.Process(process.pid).name()
name_splits = process_name.split(" ")
task_name = name_splits[3] if len(name_splits) >= 4 and name_splits[2] == "processing" else ""
except psutil.NoSuchProcess:
pass
process.terminate()
logger.warning(
_("reincarnated worker %(name)s after timeout")
% {"name": process.name}
)
if task_name:
msg = (
_("reincarnated worker %(name)s after timeout while processing task %(task_name)s")
% {"name": process.name, "task_name": task_name}
)
else:
msg = (
_("reincarnated worker %(name)s after timeout")
% {"name": process.name}
)
logger.critical(msg)
elif int(process.timer.value) == -2:
logger.info(_("recycled worker %(name)s") % {"name": process.name})
else:
logger.error(
logger.critical(
_("reincarnated worker %(name)s after death")
% {"name": process.name}
)
@@ -358,9 +376,12 @@ def pusher(task_queue: Queue, event: Event, broker: Broker = None):
"""
if not broker:
broker = get_broker()
proc_name = current_process().name
if setproctitle:
setproctitle.setproctitle(f"qcluster {proc_name} pusher")
logger.info(
_("%(process_name)s pushing tasks at %(id)s")
% {"process_name": current_process().name, "id": current_process().pid}
_("%(name)s pushing tasks at %(id)s")
% {"name": proc_name, "id": current_process().pid}
)
while True:
try:
@@ -398,9 +419,11 @@ def monitor(result_queue: Queue, broker: Broker = None):
"""
if not broker:
broker = get_broker()
name = current_process().name
proc_name = current_process().name
if setproctitle:
setproctitle.setproctitle(f"qcluster {proc_name} monitor")
logger.info(
_("%(name)s monitoring at %(id)s") % {"name": name, "id": current_process().pid}
_("%(name)s monitoring at %(id)s") % {"name": proc_name, "id": current_process().pid}
)
for task in iter(result_queue.get, "STOP"):
# save the result
@@ -432,7 +455,7 @@ def monitor(result_queue: Queue, broker: Broker = None):
"task_result": task["result"],
}
)
logger.info(_("%(name)s stopped monitoring results") % {"name": name})
logger.info(_("%(name)s stopped monitoring results") % {"name": proc_name})
def worker(
@@ -451,6 +474,8 @@ def worker(
_("%(proc_name)s ready for work at %(id)s")
% {"proc_name": proc_name, "id": current_process().pid}
)
if setproctitle:
setproctitle.setproctitle(f"qcluster {proc_name} idle")
task_count = 0
if timeout is None:
timeout = -1
@@ -459,18 +484,30 @@ def worker(
result = None
timer.value = -1 # Idle
task_count += 1
f = task["func"]
# Log task creation and set process name
# Get the function from the task
func = task["func"]
func_name = get_func_repr(func)
logger.info(
_("%(proc_name)s processing '%(func_name)s' (%(task_name)s)")
func_name = get_func_repr(f)
task_name = task["name"]
task_desc = (
_("%(proc_name)s processing %(task_name)s '%(func_name)s'")
% {
"proc_name": proc_name,
"func_name": func_name,
"task_name": task["name"],
"task_name": task_name,
}
)
f = task["func"]
if "group" in task:
task_desc += f" [{task['group']}]"
logger.info(task_desc)
if setproctitle:
proc_title = f"qcluster {proc_name} processing {task_name} '{func_name}'"
if "group" in task:
proc_title += f" [{task['group']}]"
setproctitle.setproctitle(proc_title)
# if it's not an instance try to get it from the string
if not callable(f):
# locate() returns None if f cannot be loaded
@@ -500,6 +537,8 @@ def worker(
task["stopped"] = timezone.now()
result_queue.put(task)
timer.value = -1 # Idle
if setproctitle:
setproctitle.setproctitle(f"qcluster {proc_name} idle")
# Recycle
if task_count == Conf.RECYCLE or rss_check():
timer.value = -2 # Recycled

View File

@@ -27,6 +27,11 @@ try:
except ModuleNotFoundError:
resource = None
try:
import setproctitle
except ModuleNotFoundError:
setproctitle = None
class Conf:
"""

View File

@@ -42,17 +42,18 @@ msgstr "Q-Cluster %(name)s wird gestartet."
msgid "Q Cluster %(name)s stopping."
msgstr "Q-Cluster {name} wird gestoppt."
#: cluster.py:87
#: cluster.py:91
#, python-format
msgid "Q Cluster %(name)s has stopped."
msgstr "Q-Cluster %(name)s wurde gestoppt."
#: cluster.py:94
#, python-format
msgid "%(name)s got signal %(signal)s"
msgstr "%(name)s erhielt das Signal %(signal)s"
#: cluster.py:221
#: cluster.py:225
#, python-format
msgid "reincarnated monitor %(name)s after sudden death"
msgstr "Monitor %(name)s wurde nach unerwartetem Absturz neu gestartet"
@@ -62,7 +63,15 @@ msgstr "Monitor %(name)s wurde nach unerwartetem Absturz neu gestartet"
msgid "reincarnated pusher %(name)s after sudden death"
msgstr "Pusher %(name)s wurde nach unerwartetem Absturz neu gestartet"
#: cluster.py:238
#: cluster.py:251
#, fuzzy, python-format
#| msgid "reincarnated worker %(name)s after timeout"
msgid ""
"reincarnated worker %(name)s after timeout while processing task "
"%(task_name)s"
msgstr "Worker %(name)s wurde nach Zeitüberschreitung neu gestartet"
#: cluster.py:256
#, python-format
msgid "reincarnated worker %(name)s after timeout"
msgstr "Worker %(name)s wurde nach Zeitüberschreitung neu gestartet"
@@ -87,6 +96,7 @@ msgstr "%(name)s beschützt das Cluster %(cluster_name)s"
msgid "Q Cluster %(cluster_name)s running."
msgstr "Q-Cluster %(cluster_name)s läuft."
#: cluster.py:314
#, python-format
msgid "%(name)s stopping cluster processes"
@@ -97,63 +107,66 @@ msgstr "%(name)s hält Cluster-Prozesse an"
msgid "%(name)s waiting for the monitor."
msgstr "%(name)s wartet auf den Monitor."
#: cluster.py:362
#, python-format
msgid "%(process_name)s pushing tasks at %(id)s"
#: cluster.py:384
#, fuzzy, python-format
#| msgid "%(process_name)s pushing tasks at %(id)s"
msgid "%(name)s pushing tasks at %(id)s"
msgstr "%(process_name)s veröffentlicht Aufagaben auf %(id)s"
#: cluster.py:386
#: cluster.py:408
#, python-format
msgid "queueing from %(list_key)s"
msgstr "Einreihen von %(list_key)s"
#: cluster.py:390
#: cluster.py:412
#, python-format
msgid "%(name)s stopped pushing tasks"
msgstr "%(name)s veröffentlicht keine Aufgaben mehr"
#: cluster.py:403
#: cluster.py:427
#, python-format
msgid "%(name)s monitoring at %(id)s"
msgstr "%(name)s beobachtet auf %(id)s"
#: cluster.py:422
#: cluster.py:446
#, python-format
msgid "Processed '%(info_name)s' (%(task_name)s)"
msgstr "[%(task_name)s] - '%(info_name)s' wurde verarbeitet"
#: cluster.py:428
#: cluster.py:452
#, python-format
msgid "Failed '%(info_name)s' (%(task_name)s) - %(task_result)s"
msgstr "'%(info_name)s' (%(task_name)s) ist fehlgeschlagen - %(task_result)s"
#: cluster.py:435
#: cluster.py:459
#, python-format
msgid "%(name)s stopped monitoring results"
msgstr "%(name)s überwacht keine Ergebnisse mehr"
#: cluster.py:451
#: cluster.py:475
#, python-format
msgid "%(proc_name)s ready for work at %(id)s"
msgstr "%(proc_name)s ist bereit für Arbeit auf %(id)s"
#: cluster.py:466
#, python-format
msgid "%(proc_name)s processing '%(func_name)s' (%(task_name)s)"
#: cluster.py:495
#, fuzzy, python-format
#| msgid "%(proc_name)s processing '%(func_name)s' (%(task_name)s)"
msgid "%(proc_name)s processing %(task_name)s '%(func_name)s'"
msgstr "%(proc_name)s verarbeitet '%(func_name)s' (%(task_name)s)"
#: cluster.py:507
#: cluster.py:543
#, python-format
msgid "%(proc_name)s stopped doing work"
msgstr "%(proc_name)s hat die Arbeit beendet"
#: cluster.py:712
#: cluster.py:756
#, python-format
msgid "%(process_name)s failed to create a task from schedule [%(schedule)s]"
msgstr ""
"%(process_name)s konnte keine Aufgabe von Zeitplan [%(schedule)s] erstellen"
#: cluster.py:723
#: cluster.py:767
#, fuzzy, python-format
#| msgid "%(process_name)s created a task from schedule [%(schedule)s]"
msgid ""
@@ -161,22 +174,22 @@ msgid ""
msgstr ""
"%(process_name)s hat eine Aufgabe des Zeitplans [%(schedule)s] erstellt"
#: cluster.py:769
#: cluster.py:813
msgid "Skipping cpu affinity because psutil was not found."
msgstr "Cpu-Affinität wird übersprungen, da psutil nicht gefunden wurde."
#: cluster.py:774
#: cluster.py:818
msgid "Faking cpu affinity because it is not supported on this platform"
msgstr ""
"Vortäuschen von CPU-Affinität, da diese auf dieser Plattform nicht "
"unterstützt wird"
#: cluster.py:796
#: cluster.py:840
#, python-format
msgid "%(pid)s will use cpu %(affinity)s"
msgstr "%(pid)s wird CPU %(affinity)s benutzen"
#: conf.py:85
#: conf.py:93
#, python-format
msgid ""
"SAVE_LIMIT_PER (%(option)s) is not a valid option. Options are: 'group', "
@@ -186,23 +199,23 @@ msgstr ""
"'group', 'name', 'func' und None. Standard ist None."
#. Translators: Cluster status descriptions
#: conf.py:202
#: conf.py:210
msgid "Starting"
msgstr "Wird gestartet"
#: conf.py:203
#: conf.py:211
msgid "Working"
msgstr "Arbeitet"
#: conf.py:204
#: conf.py:212
msgid "Idle"
msgstr "Leerlauf"
#: conf.py:205
#: conf.py:213
msgid "Stopped"
msgstr "Gestoppt"
#: conf.py:206
#: conf.py:214
msgid "Stopping"
msgstr "Wird gestoppt"
@@ -226,119 +239,116 @@ msgstr "Überwacht die Speichernutzung von Q Cluster"
msgid "Monitors Q Cluster activity"
msgstr "Q-Cluster aktiv überwachen"
#: models.py:125
#: models.py:124
msgid "Successful task"
msgstr "Erfolgreiche Aufgabe"
#: models.py:126
#: models.py:125
msgid "Successful tasks"
msgstr "Erfolgreiche Aufgaben"
#: models.py:141
#: models.py:140
msgid "Failed task"
msgstr "Fehlgeschlagene Aufgabe"
#: models.py:142
#: models.py:141
msgid "Failed tasks"
msgstr "Fehlgeschlagene Aufgaben"
#: models.py:150 models.py:234
#: models.py:149 models.py:222
msgid "Please install croniter to enable cron expressions"
msgstr "Bitte installieren Sie croniter, um Cron-Ausdrücke zu aktivieren"
#: models.py:170
#: models.py:165
msgid "e.g. 1, 2, 'John'"
msgstr "zum Beispiel 1, 2, 'John'"
#: models.py:172
#: models.py:167
msgid "e.g. x=1, y=2, name='John'"
msgstr "zum Beispiel x=1, y=2, name='John'"
#: models.py:186
#: models.py:181
msgid "Once"
msgstr "Einmal"
#: models.py:187
#: models.py:182
msgid "Minutes"
msgstr "Minuten"
#: models.py:188
#: models.py:183
msgid "Hourly"
msgstr "Stündlich"
#: models.py:189
#: models.py:184
msgid "Daily"
msgstr "Täglich"
#: models.py:190
#: models.py:185
msgid "Weekly"
msgstr "Wöchentlich"
#: models.py:191
#: models.py:186
msgid "Biweekly"
msgstr "Zweiwöchentlich"
#: models.py:192
#: models.py:187
msgid "Monthly"
msgstr "Monatlich"
#: models.py:193
#: models.py:188
msgid "Bimonthly"
msgstr "Zweimonatlich"
#: models.py:194
#: models.py:189
msgid "Quarterly"
msgstr "Vierteljährlich"
#: models.py:195
#: models.py:190
msgid "Yearly"
msgstr "Jährlich"
#: models.py:196
#: models.py:191
msgid "Cron"
msgstr "Cron"
#: models.py:199
#: models.py:194
msgid "Schedule Type"
msgstr "Zeitplan-Typ"
#: models.py:202
#: models.py:197
msgid "Number of minutes for the Minutes type"
msgstr "Anzahl Minuten für den Typ 'Minuten'"
#: models.py:205
#: models.py:200
msgid "Repeats"
msgstr "Wiederhohlungen"
#: models.py:205
#: models.py:200
msgid "n = n times, -1 = forever"
msgstr "n = n mal, -1 = für immer"
#: models.py:208
#: models.py:203
msgid "Next Run"
msgstr "Nächste Ausführung"
#: models.py:215
#: models.py:210
msgid "Cron expression"
msgstr "Cron-Ausdruck"
#: models.py:224
msgid "Name of kwarg to pass intended schedule date"
msgstr ""
#: models.py:299
#: models.py:287
msgid "Scheduled task"
msgstr "Geplante Aufgabe"
#: models.py:300
#: models.py:288
msgid "Scheduled tasks"
msgstr "Geplante Aufgaben"
#: models.py:326
#: models.py:314
msgid "Queued task"
msgstr "Eingereihte Aufgabe"
#: models.py:327
#: models.py:315
msgid "Queued tasks"
msgstr "Eingereihte Aufgaben"

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-15 23:35+0100\n"
"POT-Creation-Date: 2023-01-07 19:21+0100\n"
"PO-Revision-Date: 2018-08-05 18:28+0200\n"
"Last-Translator: Thierry BOULOGNE <contact@tng-concepts.com>\n"
"Language-Team: \n"
@@ -21,160 +21,172 @@ msgstr ""
msgid "Resubmit selected tasks to queue"
msgstr "Resoumettre les tâches sélectionnées à la file d'attente"
#: admin.py:107 models.py:293
#: admin.py:107 models.py:281
#, fuzzy
#| msgid "Success"
msgid "success"
msgstr "succès"
#: admin.py:119 models.py:295
#: admin.py:119 models.py:283
msgid "last_run"
msgstr ""
#: cluster.py:76
#: cluster.py:80
#, python-format
msgid "Q Cluster %(name)s starting."
msgstr "Démarrage de Q Cluster-%(name)s."
#: cluster.py:84
#: cluster.py:88
#, python-format
msgid "Q Cluster %(name)s stopping."
msgstr "Arrêt de Q Cluster-%(name)s."
#: cluster.py:87
#: cluster.py:91
#, python-format
msgid "Q Cluster %(name)s has stopped."
msgstr "Q Cluster-%(name)s a été arrêté."
#: cluster.py:94
#: cluster.py:98
#, python-format
msgid "%(name)s got signal %(signal)s"
msgstr "%(name)s à reçu le signal %(signal)s"
#: cluster.py:221
#: cluster.py:225
#, python-format
msgid "reincarnated monitor %(name)s after sudden death"
msgstr "moniteur réintégré %(name)s après un arrêt intempestif"
msgstr "surveillant %(name)s réincarné après un arrêt intempestif"
#: cluster.py:227
#: cluster.py:231
#, python-format
msgid "reincarnated pusher %(name)s after sudden death"
msgstr "pousseur réintégré %(name)s après un arrêt intempestif"
msgstr "répartiteur %(name)s réincarné après un arrêt intempestif"
#: cluster.py:238
#: cluster.py:251
#, python-format
msgid ""
"reincarnated worker %(name)s after timeout while processing task "
"%(task_name)s"
msgstr ""
"processus %(name)s réincarné, délai de traitement dépassé pour la tâche "
"%(task_name)s"
#: cluster.py:256
#, python-format
msgid "reincarnated worker %(name)s after timeout"
msgstr "processus réintégré %(name)s après un arrêt une attente trop longue"
msgstr "processus %(name)s réincarné, délai de traitement dépassé"
#: cluster.py:242
#: cluster.py:261
#, python-format
msgid "recycled worker %(name)s"
msgstr "processus recyclé %(name)s"
#: cluster.py:245
#: cluster.py:264
#, python-format
msgid "reincarnated worker %(name)s after death"
msgstr "processus réintégré %(name)s après arrêt"
#: cluster.py:269
#: cluster.py:288
#, python-format
msgid "%(name)s guarding cluster %(cluster_name)s"
msgstr "%(name)s surveillance du cluster à %(cluster_name)s"
#: cluster.py:278
#: cluster.py:297
#, python-format
msgid "Q Cluster %(cluster_name)s running."
msgstr "Démarrage de Q Cluster-%(cluster_name)s."
#: cluster.py:314
#: cluster.py:333
#, python-format
msgid "%(name)s stopping cluster processes"
msgstr "%(name)s arrêt des processus de cluster"
msgstr "%(name)s arrêt des processus du cluster"
#: cluster.py:339
#: cluster.py:358
#, python-format
msgid "%(name)s waiting for the monitor."
msgstr "%(name)s en attente du moniteur."
msgstr "%(name)s en attente du surveillant."
#: cluster.py:362
#: cluster.py:384
#, python-format
msgid "%(process_name)s pushing tasks at %(id)s"
msgstr "%(process_name)s tâche envoyé à %(id)s"
msgid "%(name)s pushing tasks at %(id)s"
msgstr "%(name)s répartit les tâches %(id)s"
#: cluster.py:386
#: cluster.py:408
#, python-format
msgid "queueing from %(list_key)s"
msgstr "mise en file d'attente de %(list_key)s"
#: cluster.py:390
#: cluster.py:412
#, python-format
msgid "%(name)s stopped pushing tasks"
msgstr "%(name)s a cessé de pousser les tâches"
msgstr "%(name)s a cessé de répartir les tâches"
#: cluster.py:403
#: cluster.py:427
#, python-format
msgid "%(name)s monitoring at %(id)s"
msgstr "%(name)s Surveillance de %(id)s"
msgstr "%(name)s surveille les résultats %(id)s"
#: cluster.py:422
#: cluster.py:446
#, python-format
msgid "Processed '%(info_name)s' (%(task_name)s)"
msgstr "traité '%(info_name)s' (%(task_name)s)"
#: cluster.py:428
#: cluster.py:452
#, python-format
msgid "Failed '%(info_name)s' (%(task_name)s) - %(task_result)s"
msgstr "Manqué '%(info_name)s' (%(task_name)s) - %(task_result)s"
#: cluster.py:435
#: cluster.py:459
#, python-format
msgid "%(name)s stopped monitoring results"
msgstr "%(name)s arrêt des résultats de surveillance"
msgstr "%(name)s a cessé de de surveiller les résultats"
#: cluster.py:451
#: cluster.py:475
#, python-format
msgid "%(proc_name)s ready for work at %(id)s"
msgstr "%(proc_name)s prêt pour le travail à %(id)s"
#: cluster.py:466
#, python-format
msgid "%(proc_name)s processing '%(func_name)s' (%(task_name)s)"
msgstr "%(proc_name)s en traitement '%(func_name)s' (%(task_name)s)"
#: cluster.py:495
#, fuzzy, python-format
msgid "%(proc_name)s processing %(task_name)s '%(func_name)s'"
msgstr "%(proc_name)s exécute %(task_name)s '%(func_name)s'"
#: cluster.py:507
#: cluster.py:543
#, python-format
msgid "%(proc_name)s stopped doing work"
msgstr "%(proc_name)s arrêté de travailler"
msgstr "%(proc_name)s a cessé de travailler"
#: cluster.py:712
#: cluster.py:756
#, python-format
msgid "%(process_name)s failed to create a task from schedule [%(schedule)s]"
msgstr ""
"%(process_name)s Echec de la création d'une tâche à partir de Schedule "
"[%(schedule)s]"
#: cluster.py:723
#: cluster.py:767
#, python-format
msgid ""
"%(process_name)s created task %(task_name)s from schedule [%(schedule)s]"
msgstr "%(process_name)s a créé la tâche %(task_name)s à partir de Schedule [%(schedule)s]"
msgstr ""
"%(process_name)s a créé la tâche %(task_name)s à partir de Schedule "
"[%(schedule)s]"
#: cluster.py:769
#: cluster.py:813
msgid "Skipping cpu affinity because psutil was not found."
msgstr "Sauter l'affinité du processeur parce que psutil n'a pas été trouvé."
msgstr "L'affinité cpu ne sera pas définie car psutil n'a pas été trouvé."
#: cluster.py:774
#: cluster.py:818
msgid "Faking cpu affinity because it is not supported on this platform"
msgstr ""
"Simulation de l'affinité du processeur parce qu'elle n'est pas supportée sur "
"cette plateforme."
"Simulation de l'affinité cpu parce qu'elle n'est pas supportée sur cette "
"plateforme."
#: cluster.py:796
#: cluster.py:840
#, python-format
msgid "%(pid)s will use cpu %(affinity)s"
msgstr "%(pid)s utilisera le CPU %(affinity)s"
#: conf.py:85
#: conf.py:93
#, python-format
msgid ""
"SAVE_LIMIT_PER (%(option)s) is not a valid option. Options are: 'group', "
@@ -184,23 +196,23 @@ msgstr ""
"'group', 'name', 'func' et None. La valeur par défaut est None."
#. Translators: Cluster status descriptions
#: conf.py:202
#: conf.py:210
msgid "Starting"
msgstr "Démarrage"
#: conf.py:203
#: conf.py:211
msgid "Working"
msgstr "Actif"
#: conf.py:204
#: conf.py:212
msgid "Idle"
msgstr "En attente"
#: conf.py:205
#: conf.py:213
msgid "Stopped"
msgstr "Arrêté"
#: conf.py:206
#: conf.py:214
msgid "Stopping"
msgstr "En cours darrêt"
@@ -219,130 +231,126 @@ msgstr "Informations générales sur tous les clusters."
#, fuzzy
#| msgid "Monitors Q Cluster activity"
msgid "Monitors Q Cluster memory usage"
msgstr "Surveille l'utilisation de la mémoire du cluster Q"
msgstr "Surveille l'utilisation mémoire du Q cluster"
#. Translators: help text for qmonitor management command
#: management/commands/qmonitor.py:9
msgid "Monitors Q Cluster activity"
msgstr "Activité du cluster Moniteur Q"
msgstr "Surveille l'activité de Q cluster"
#: models.py:125
#: models.py:124
msgid "Successful task"
msgstr "Tâche réussie"
#: models.py:126
#: models.py:125
msgid "Successful tasks"
msgstr "Tâches réussies"
#: models.py:141
#: models.py:140
msgid "Failed task"
msgstr "Tâche échoué"
#: models.py:142
#: models.py:141
msgid "Failed tasks"
msgstr "Tâches échouées"
#: models.py:150 models.py:234
#: models.py:149 models.py:222
msgid "Please install croniter to enable cron expressions"
msgstr "Veuillez installer croniter pour activer les expressions croniques."
msgstr "Veuillez installer croniter pour activer les expressions cron."
#: models.py:170
#: models.py:165
msgid "e.g. 1, 2, 'John'"
msgstr "ex. 1, 2, Jean"
#: models.py:172
#: models.py:167
msgid "e.g. x=1, y=2, name='John'"
msgstr "p. ex. x = 1, y = 2, Nom = Jean"
#: models.py:186
#: models.py:181
msgid "Once"
msgstr "Une fois"
#: models.py:187
#: models.py:182
msgid "Minutes"
msgstr "Minutes"
#: models.py:188
#: models.py:183
msgid "Hourly"
msgstr "Toutes les heures"
#: models.py:189
#: models.py:184
msgid "Daily"
msgstr "Quotidien"
#: models.py:190
#: models.py:185
msgid "Weekly"
msgstr "Hebdomadaire"
#: models.py:191
#: models.py:186
#, fuzzy
#| msgid "Weekly"
msgid "Biweekly"
msgstr "Bihebdomadaire"
#: models.py:192
#: models.py:187
msgid "Monthly"
msgstr "Mensuel"
#: models.py:193
#: models.py:188
#, fuzzy
#| msgid "Monthly"
msgid "Bimonthly"
msgstr "Bimestriel"
#: models.py:194
#: models.py:189
msgid "Quarterly"
msgstr "Tous les quart-dheure"
#: models.py:195
#: models.py:190
msgid "Yearly"
msgstr "Annuel"
#: models.py:196
#: models.py:191
msgid "Cron"
msgstr "Cron"
#: models.py:199
#: models.py:194
msgid "Schedule Type"
msgstr "Type de plannification"
#: models.py:202
#: models.py:197
msgid "Number of minutes for the Minutes type"
msgstr "Nombre de minutes pour le type de minutes"
#: models.py:205
#: models.py:200
msgid "Repeats"
msgstr "Répéter"
#: models.py:205
#: models.py:200
msgid "n = n times, -1 = forever"
msgstr "n = n fois,-1 = Toujours"
#: models.py:208
#: models.py:203
msgid "Next Run"
msgstr "Prochaine exécution"
#: models.py:215
#: models.py:210
msgid "Cron expression"
msgstr "Expression du Cron"
msgstr "Expression Cron"
#: models.py:224
msgid "Name of kwarg to pass intended schedule date"
msgstr "Nom du kwarg pour passer la date d'éxecution prévue"
#: models.py:299
#: models.py:287
msgid "Scheduled task"
msgstr "Tâche planifiée"
#: models.py:300
#: models.py:288
msgid "Scheduled tasks"
msgstr "Tâches planifiées"
#: models.py:326
#: models.py:314
msgid "Queued task"
msgstr "Tâche en file d'attente"
#: models.py:327
#: models.py:315
msgid "Queued tasks"
msgstr "Tâches en file d'attente"
@@ -482,13 +490,12 @@ msgstr "Aucun cluster ne semble être en cours d'exécution."
#: signals.py:22
#, python-format
msgid "malformed return hook '%(hook)s' for [%(name)s]"
msgstr "hook de retour mal formé' %(hook)s 'pour [%(name)s]"
msgstr "hook de retour '%(hook)s' mal formé pour [%(name)s]"
#: signals.py:30
#, python-format
msgid "return hook %(hook)s failed on [%(name)s] because %(error)s"
msgstr ""
"le crochet de retour %(hook)s a échoué sur [%(name)s] parce que %(error)s"
msgstr "hook de retour %(hook)s a échoué sur [%(name)s] à cause de %(error)s"
#, python-format
#~ msgid ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-15 23:35+0100\n"
"POT-Creation-Date: 2023-01-07 19:21+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Ethem Güner <ethemguener@gmail.com>\n"
"Language-Team: \n"
@@ -22,157 +22,167 @@ msgstr ""
msgid "Resubmit selected tasks to queue"
msgstr "Seçili işleri kuyruğa tekrar gönder"
#: admin.py:107 models.py:293
#: admin.py:107 models.py:281
#, fuzzy
#| msgid "Success"
msgid "success"
msgstr "başarılı olanlar"
#: admin.py:119 models.py:295
#: admin.py:119 models.py:283
msgid "last_run"
msgstr ""
#: cluster.py:76
#: cluster.py:80
#, python-format
msgid "Q Cluster %(name)s starting."
msgstr "Q Cluster %(name)s başlatılıyor."
#: cluster.py:84
#: cluster.py:88
#, python-format
msgid "Q Cluster %(name)s stopping."
msgstr "Q Cluster %(name)s durduruluyor."
#: cluster.py:87
#: cluster.py:91
#, python-format
msgid "Q Cluster %(name)s has stopped."
msgstr "Q Cluster %(name)s durduruldu."
#: cluster.py:94
#: cluster.py:98
#, python-format
msgid "%(name)s got signal %(signal)s"
msgstr "%(name)s, %(signal)s pid'inde izleniyor/monitoring yapılıyor."
#: cluster.py:221
#: cluster.py:225
#, python-format
msgid "reincarnated monitor %(name)s after sudden death"
msgstr "Monitor %(name)s ani ölüm sonrası tekrar dirildi"
#: cluster.py:227
#: cluster.py:231
#, python-format
msgid "reincarnated pusher %(name)s after sudden death"
msgstr "Pusher %(name)s ani ölüm sonrası tekrar dirildi"
#: cluster.py:238
#: cluster.py:251
#, fuzzy, python-format
#| msgid "reincarnated worker %(name)s after timeout"
msgid ""
"reincarnated worker %(name)s after timeout while processing task "
"%(task_name)s"
msgstr "Worker %(name)s zaman aşımı sonrası tekrar dirildi"
#: cluster.py:256
#, python-format
msgid "reincarnated worker %(name)s after timeout"
msgstr "Worker %(name)s zaman aşımı sonrası tekrar dirildi"
#: cluster.py:242
#: cluster.py:261
#, python-format
msgid "recycled worker %(name)s"
msgstr "Worker %(name)s geri döndürüldü"
#: cluster.py:245
#: cluster.py:264
#, python-format
msgid "reincarnated worker %(name)s after death"
msgstr "Worker %(name)s ani ölüm sonrası tekrar dirildi"
#: cluster.py:269
#: cluster.py:288
#, python-format
msgid "%(name)s guarding cluster %(cluster_name)s"
msgstr "%(name)s, %(cluster_name)s cluster'ını koruyor"
#: cluster.py:278
#: cluster.py:297
#, python-format
msgid "Q Cluster %(cluster_name)s running."
msgstr "Q Cluster %(cluster_name)s başlatılıyor."
#: cluster.py:314
#: cluster.py:333
#, python-format
msgid "%(name)s stopping cluster processes"
msgstr "Cluster %(name)s işlemleri durduruluyor."
#: cluster.py:339
#: cluster.py:358
#, python-format
msgid "%(name)s waiting for the monitor."
msgstr "%(name)s monitor için bekliyor."
#: cluster.py:362
#, python-format
msgid "%(process_name)s pushing tasks at %(id)s"
#: cluster.py:384
#, fuzzy, python-format
#| msgid "%(process_name)s pushing tasks at %(id)s"
msgid "%(name)s pushing tasks at %(id)s"
msgstr "%(process_name)s, işleri %(id)s pid'ine gönderiyor."
#: cluster.py:386
#: cluster.py:408
#, python-format
msgid "queueing from %(list_key)s"
msgstr ""
#: cluster.py:390
#: cluster.py:412
#, python-format
msgid "%(name)s stopped pushing tasks"
msgstr "%(name)s işleri göndermeyi durdurdu"
#: cluster.py:403
#: cluster.py:427
#, python-format
msgid "%(name)s monitoring at %(id)s"
msgstr "%(name)s, %(id)s pid'inde izleniyor/monitoring yapılıyor."
#: cluster.py:422
#: cluster.py:446
#, python-format
msgid "Processed '%(info_name)s' (%(task_name)s)"
msgstr "[%(task_name)s] - '%(info_name)s işlendi."
#: cluster.py:428
#: cluster.py:452
#, python-format
msgid "Failed '%(info_name)s' (%(task_name)s) - %(task_result)s"
msgstr "[%(task_name)s] - '%(info_name)s' - %(task_result)s başarısız oldu"
#: cluster.py:435
#: cluster.py:459
#, python-format
msgid "%(name)s stopped monitoring results"
msgstr "%(name)s sonuçları göstermeyi bıraktı"
#: cluster.py:451
#: cluster.py:475
#, python-format
msgid "%(proc_name)s ready for work at %(id)s"
msgstr "%(proc_name)s, %(id)s pid'inde çalışmaya hazır"
#: cluster.py:466
#, python-format
msgid "%(proc_name)s processing '%(func_name)s' (%(task_name)s)"
#: cluster.py:495
#, fuzzy, python-format
#| msgid "%(proc_name)s processing '%(func_name)s' (%(task_name)s)"
msgid "%(proc_name)s processing %(task_name)s '%(func_name)s'"
msgstr "%(proc_name)s, '%(func_name)s' [%(task_name)s] işlerini işiyor"
#: cluster.py:507
#: cluster.py:543
#, python-format
msgid "%(proc_name)s stopped doing work"
msgstr "%(proc_name)s çalışmayı bıraktı"
#: cluster.py:712
#: cluster.py:756
#, python-format
msgid "%(process_name)s failed to create a task from schedule [%(schedule)s]"
msgstr "%(process_name)s programdan bir görev oluşturamadı [%(schedule)s]"
#: cluster.py:723
#: cluster.py:767
#, fuzzy, python-format
#| msgid "%(process_name)s created a task from schedule [%(schedule)s]"
msgid ""
"%(process_name)s created task %(task_name)s from schedule [%(schedule)s]"
msgstr "%(process_name)s programdan bir görev oluşturamadı [%(schedule)s]"
#: cluster.py:769
#: cluster.py:813
msgid "Skipping cpu affinity because psutil was not found."
msgstr "Psutil bulunamadığı için cpu benzeşimi atlanıyor."
#: cluster.py:774
#: cluster.py:818
msgid "Faking cpu affinity because it is not supported on this platform"
msgstr "Bu platformda desteklenmediği için sahte cpu benzeşimi"
#: cluster.py:796
#: cluster.py:840
#, python-format
msgid "%(pid)s will use cpu %(affinity)s"
msgstr "%(pid)s cpu %(affinity)s kullanacaktır"
#: conf.py:85
#: conf.py:93
#, python-format
msgid ""
"SAVE_LIMIT_PER (%(option)s) is not a valid option. Options are: 'group', "
@@ -182,23 +192,23 @@ msgstr ""
"'group', 'name', 'func' ve None. Varsayılan değer None'dır."
#. Translators: Cluster status descriptions
#: conf.py:202
#: conf.py:210
msgid "Starting"
msgstr "Başlıyor"
#: conf.py:203
#: conf.py:211
msgid "Working"
msgstr "Çalışıyor"
#: conf.py:204
#: conf.py:212
msgid "Idle"
msgstr "Boşta"
#: conf.py:205
#: conf.py:213
msgid "Stopped"
msgstr "Durdu"
#: conf.py:206
#: conf.py:214
msgid "Stopping"
msgstr "Durduruluyor"
@@ -222,123 +232,119 @@ msgstr "Q Cluster'ın bellek kullanımını izler"
msgid "Monitors Q Cluster activity"
msgstr "Q Cluster'ın aktivitelerini izler"
#: models.py:125
#: models.py:124
msgid "Successful task"
msgstr "Başarılı iş"
#: models.py:126
#: models.py:125
msgid "Successful tasks"
msgstr "Başarılı işler"
#: models.py:141
#: models.py:140
msgid "Failed task"
msgstr "Başarısız iş"
#: models.py:142
#: models.py:141
msgid "Failed tasks"
msgstr "Başarısız işler"
#: models.py:150 models.py:234
#: models.py:149 models.py:222
msgid "Please install croniter to enable cron expressions"
msgstr "Cron expressions'ları açmak için croniter yükleyin"
#: models.py:170
#: models.py:165
msgid "e.g. 1, 2, 'John'"
msgstr "Örneğin: 1, 2, 'Melih'"
#: models.py:172
#: models.py:167
msgid "e.g. x=1, y=2, name='John'"
msgstr "Örneğin: x=1, y=2, name='Melih'"
#: models.py:186
#: models.py:181
msgid "Once"
msgstr "Bir kere"
#: models.py:187
#: models.py:182
msgid "Minutes"
msgstr "Dakika"
#: models.py:188
#: models.py:183
msgid "Hourly"
msgstr "Saatlik"
#: models.py:189
#: models.py:184
msgid "Daily"
msgstr "Günlük"
#: models.py:190
#: models.py:185
msgid "Weekly"
msgstr "Haftalık"
#: models.py:191
#: models.py:186
#, fuzzy
#| msgid "Weekly"
msgid "Biweekly"
msgstr "İki haftada bir"
#: models.py:192
#: models.py:187
msgid "Monthly"
msgstr "Aylık"
#: models.py:193
#: models.py:188
#, fuzzy
#| msgid "Monthly"
msgid "Bimonthly"
msgstr "İki ayda bir"
#: models.py:194
#: models.py:189
msgid "Quarterly"
msgstr "Bir Çeyrek (3 Ay)"
#: models.py:195
#: models.py:190
msgid "Yearly"
msgstr "Yıllık"
#: models.py:196
#: models.py:191
msgid "Cron"
msgstr ""
#: models.py:199
#: models.py:194
msgid "Schedule Type"
msgstr "Zamanlama Tipi"
#: models.py:202
#: models.py:197
msgid "Number of minutes for the Minutes type"
msgstr "Dakika tipine göre dakika sayısı"
#: models.py:205
#: models.py:200
msgid "Repeats"
msgstr "Tekrar eder"
#: models.py:205
#: models.py:200
msgid "n = n times, -1 = forever"
msgstr "n = n kere, -1 = sonsuza kadar"
#: models.py:208
#: models.py:203
msgid "Next Run"
msgstr "Bir dahaki çalışma tarihi"
#: models.py:215
#: models.py:210
msgid "Cron expression"
msgstr ""
#: models.py:224
msgid "Name of kwarg to pass intended schedule date"
msgstr ""
#: models.py:299
#: models.py:287
msgid "Scheduled task"
msgstr "Zamanlanmış iş"
#: models.py:300
#: models.py:288
msgid "Scheduled tasks"
msgstr "Zamanlanmış işler"
#: models.py:326
#: models.py:314
msgid "Queued task"
msgstr "Sıraya alınmış iş"
#: models.py:327
#: models.py:315
msgid "Queued tasks"
msgstr "Sıraya alınmış işler"

View File

@@ -55,6 +55,10 @@ Optional
$ pip install psutil
- `setproctitle <https://github.com/dvarrazzo/py-setproctitle>`__ python module to customize the process title by Daniele Varrazzo', is an optional requirement used to set informative process titles::
$ pip install setproctitle
- `Hiredis <https://github.com/redis/hiredis>`__ parser. This C library maintained by the core Redis team is faster than the standard PythonParser during high loads::
$ pip install hiredis

2077
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -59,6 +59,7 @@ croniter = { version = "^1.3.7", optional = true }
django-q-rollbar = {version = ">=0.1", optional = true}
django-q-sentry = {version = ">=0.1", optional = true}
redis = {version = "^4.3.4", optional = true}
setproctitle = {version = "^1.3.2", optional = true}
[tool.poetry.dev-dependencies]
@@ -72,7 +73,7 @@ isort = {extras = ["requirements_deprecated_finder"], version = "^5.10.1"}
[tool.poetry.extras]
requires = ["poetry_core>=1.0.0"]
build-backend = ["poetry.core.masonry.api"]
testing = ["django-redis", "croniter", "hiredis", "psutil", "iron-mq", "boto3", "pymongo", "blessed", "redis"]
testing = ["django-redis", "croniter", "hiredis", "psutil", "iron-mq", "boto3", "pymongo", "blessed", "redis", "setproctitle"]
rollbar = ["django-q-rollbar"]
sentry = ["django-q-sentry"]