Non-GUI, single processort inter process massaging - how?

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sat Jul 21 08:47:10 EDT 2018


On Sat, 21 Jul 2018 09:07:23 +0100, Chris Green wrote:

[...]
> I want to be able to interrogate the server process from several client
> processes, some will interrogate it multiple times, others once only. 
> They are mostly (all?) run from the command line (bash).


This sounds like a good approach for signals. Your server script sets up 
one or more callbacks that print the desired information to stdout, or 
writes it to a file, whichever is more convenient, and then you send the 
appropriate signal to the server process from the client processes.

At the bash command line, you use the kill command: see `man kill` for 
details.


Here's a tiny demo:

# === cut ===

import signal, os, time
state = 0

def sig1(signum, stack):
    print(time.strftime('it is %H:%m:%S'))

def sig2(signum, stack):
    print("Current state:", stack.f_globals['state'])

# Register signal handlers
signal.signal(signal.SIGUSR1, sig1)
signal.signal(signal.SIGUSR2, sig2)

# Print the process ID.
print('My PID is:', os.getpid())

while True:
    state += 1
    time.sleep(0.2)

# === cut ===


Run that in one terminal, and the first thing it does is print the 
process ID. Let's say it prints 12345, over in another terminal, you can 
run:

kill -USR1 12345
kill -USR2 12345

to send the appropriate signals.

To do this programmatically from another Python script, use the os.kill() 
function.


https://docs.python.org/3/library/signal.html

https://pymotw.com/3/signal/




-- 
Steven D'Aprano
"Ever since I learned about confirmation bias, I've been seeing
it everywhere." -- Jon Ronson



More information about the Python-list mailing list