6 votos

Python script utilizando núcleos de eficiencia en lugar de núcleos de rendimiento en M1

Estoy usando moviepy para automatizar clips para hacer un video. Estoy usando Python 3.10. Cuando ejecuto desde pycharm, está usando núcleos de rendimiento para renderizar mis videos. Pero cuando me trasladé a crontab para programar esta tarea, se está ejecutando en los núcleos de eficiencia que está tomando 3 - 4 veces el tiempo normal.

¿Cómo puedo forzar que el script se ejecute en los núcleos de rendimiento?

Processor Usage

5voto

Logicalmind Puntos 1260

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:

graph showing alternating efficiency core and performance core usage

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X