Creo que esto es lo inverso a esta pregunta . El propio Cron se ejecuta en núcleos de eficiencia porque es una tarea en segundo plano, y su script hereda sus prioridades. taskpolicy
es una interfaz para el setpriority
y getpriority
API, que, por suerte, son expuesto a Python directamente Así que debería ser capaz de import os; os.setpriority(...)
. Sin embargo, los parámetros específicos que necesitas pasar son probablemente específicos de tu aplicación en particular; parece que tienes un montón de procesos y quieres que se ejecuten con una prioridad alta, así que lee la documentación pertinente y mira si añadir a tu script te permitirá volver a elevar la prioridad de tu propia tarea desde el fondo.
Tenga en cuenta este lenguaje de man setpriority
en MacOS, el énfasis es mío:
Además, el hilo o proceso actual puede colocarse en un estado de fondo especificando PRIO_DARWIN_THREAD o PRIO_DARWIN_PROCESS para which
. Sólo se admite un valor de cero (el hilo o proceso actual) para who
al establecer u obtener el estado de fondo. prio es 0 (para eliminar el hilo actual del estado de fondo) o PRIO_DARWIN_BG (para poner el hilo actual en estado de fondo). Cuando un hilo o proceso está en un estado de fondo, la prioridad de programación se establece en el valor más bajo, la IO del disco se estrangula (con un comportamiento similar al uso de setiopolicy_np(3) para establecer una política estrangulable), y la IO de la red se estrangula para cualquier socket abierto después de pasar al estado de fondo. Los sockets abiertos previamente no se ven afectados. La llamada a getpriority() devuelve 0 cuando el hilo o proceso actual no está en estado de fondo o 1 cuando el hilo actual está en estado de fondo. Cualquier hilo o proceso puede establecerse en estado de fondo.
Tenga en cuenta que el DARWIN
valores, es decir PRIO_
DARWIN
_PROCESS
son constantes específicas de la plataforma que no están expuestas por Python, así que escribí un breve programa en C para extraerlas:
#include <stdio.h>
#include <sys/resource.h>
int main(int argc, char** argv) {
printf("PRIO_DARWIN_THREAD %d PRIO_DARWIN_PROCESS %d PRIO_DARWIN_BG %d\n",
PRIO_DARWIN_THREAD, PRIO_DARWIN_PROCESS, PRIO_DARWIN_BG);
return 0;
}
y luego escribí este script para ilustrar cómo usarlos, que alterna entre los modos de fondo y primer plano:
from os import setpriority, getpid
PRIO_DARWIN_THREAD = 0b0011
PRIO_DARWIN_PROCESS = 0b0100
PRIO_DARWIN_BG = 0x1000
from time import time
from itertools import cycle
seconds = float
def burn_cpu(how_long: seconds) -> None:
start = time()
while time() < (start + how_long):
pass
for (human, machine) in cycle([("background", PRIO_DARWIN_BG),
("foreground", 0)]):
print("in", human, getpid())
setpriority(PRIO_DARWIN_PROCESS, 0, machine)
burn_cpu(60.0)
Lo ejecuté como python3 backgroundr.py & python3 backgroundr.py & python3 backgroundr.py & python3 backgroundr.py
en mi terminal para asegurarme de que estaba usando suficiente paralelismo para aparecer correctamente en el gráfico de uso de la CPU, luego tomé esta captura de pantalla que ilustra muy claramente el movimiento entre los núcleos de rendimiento y los núcleos de eficiencia: