os.getpid() en los scripts de prueba de python de Bitcoin: ¿qué hace realmente?

Estaba mirando ../qa/rpc-tests/util.pypara averiguar cómo se asignan puertos arbitrarios a cada nodo creado. En las primeras líneas del código dice:

...
def p2p_port(n):
devuelve 11000 + n + os.getpid()%999
...

Así que me pregunto qué hace exactamente os.getpid()%999. ¿Está buscando instantáneamente un puerto libre?

¡Gracias de antemano!

Respuestas (1)

os.getpid()en Python está obteniendo la identificación del proceso actual . La identificación del procesador es 'aleatoria', ya que ejecutar la prueba completa varias veces dará como resultado un pid diferente, pero dentro de la misma prueba, el pid permanecerá constante.

El %operador es el operador de módulo , que básicamente corta todos menos los últimos 3 dígitos de la identificación del procesador.

Juntos os.getpid() % 999obtienen una compensación constante e ignoran todos menos los últimos 3 dígitos. Este nuevo número de 3 dígitos se suma a la constante 11000 para devolver el número de puerto a utilizar.

Ok, pero lo que no entiendo es cómo se puede configurar un pid dentro de un archivo de configuración para un proceso que aún no existe. ¿Puedes seguir mi pensamiento? :/
El pid que os.getpid()devuelve es el pid del script de Python en el momento en que se ejecuta. Cada vez que p2p_port(n)se llama, se devuelve la identificación del proceso que se está ejecutando actualmente. eso esta mas claro?
Sí un poco, ya que soy un novato en este campo. Entonces, ¿dice que cada vez que se ejecuta este script de python, inicia muchas instancias de proceso (nodos) del programa de python (¡no bitcoind!) que tienen identificaciones de proceso individuales?
Mirando el código ahora, parece que util.pysolo incluye funciones que son utilizadas por otras partes del código de prueba. Entonces, cada vez que otras partes del código llaman initialize_datadir()y initialize_chain()(que luego llaman p2p_port()), los pid serán los mismos si se llaman dentro del mismo proceso.
Exactamente initialize_datadir() es el punto de confusión. Mi entendimiento/patrón de crear una red de pares es el siguiente:
Paso 1) cree un archivo de configuración con puerto libre y puerto rpc
Paso 2) ejecute la instancia de bitcoind por separado especificando archivos de configuración independientes: ejecutar bitcoin instantáneamente obtiene una identificación de proceso
PERO en el código util.py me parece que los pasos 1 y 2 están torcidos ya que para escribir un archivo de configuración, un pid para el puerto no. Se necesita estructura
Creo que la fuente de confusión es que os.getpid() no es la identificación del proceso de bitcoind, sino del script de Python. No tiene nada que ver con el pid de bitcoind, y es solo una forma de hacer que el puerto sea diferente entre las pruebas.
De acuerdo. Muchas gracias, investigué un poco basándome en tus sugerencias, ¡así que ahora está mucho más claro!