can a python script know that another instance of the same script is running… and then talk to it?

前端 未结 4 1617
情歌与酒
情歌与酒 2021-02-02 01:23

I\'d like to prevent multiple instances of the same long-running python command-line script from running at the same time, and I\'d like the new instance to be able to send data

4条回答
  •  甜味超标
    2021-02-02 01:31

    The Alex Martelli approach of setting up a communications channel is the appropriate one. I would use a multiprocessing.connection.Listener to create a listener, in your choice. Documentation at: http://docs.python.org/library/multiprocessing.html#multiprocessing-listeners-clients

    Rather than using AF_INET (sockets) you may elect to use AF_UNIX for Linux and AF_PIPE for Windows. Hopefully a small "if" wouldn't hurt.

    Edit: I guess an example wouldn't hurt. It is a basic one, though.

    #!/usr/bin/env python
    
    from multiprocessing.connection import Listener, Client
    import socket
    from array import array
    from sys import argv
    
    def myloop(address):
        try:
            listener = Listener(*address)
            conn = listener.accept()
            serve(conn)
        except socket.error, e:
            conn = Client(*address)
            conn.send('this is a client')
            conn.send('close')
    
    def serve(conn):
        while True:
            msg = conn.recv()
            if msg.upper() == 'CLOSE':
                break
            print msg
        conn.close()
    
    if __name__ == '__main__':
        address = ('/tmp/testipc', 'AF_UNIX')
        myloop(address)
    

    This works on OS X, so it needs testing with both Linux and (after substituting the right address) Windows. A lot of caveats exists from a security point, the main one being that conn.recv unpickles its data, so you are almost always better of with recv_bytes.

提交回复
热议问题