Usage¶
gipc’s interface is slim. All you will probably interact with are
gipc.start_process()
, gipc.pipe()
, and their returned objects. Make
yourself familiar with gipc’s behavior by going through the code
examples as well as through the API section.
Quick-start example¶
The following example program uses gipc for spawning a child process and for creating a pipe. The pipe has a read end and a write end. The program sends a dummy Python object (the integer 0 in this case) from a greenlet in the main (parent) process through the pipe to the child process:
import gevent
import gipc
def writelet(w):
# This function runs as a greenlet in the parent process.
# Put a Python object into the write end of the pipe.
w.put(0)
def readchild(r):
# This function runs in a child process.
# Read object from the read end of the pipe and confirm that it is the
# expected one.
assert r.get() == 0
def main():
with gipc.pipe() as (readend, writeend):
# Start 'writer' greenlet. Provide it with the pipe write end.
g = gevent.spawn(writelet, writeend)
# Start 'reader' child process. Provide it with the pipe read end.
p = gipc.start_process(target=readchild, args=(readend,))
# Wait for both to finish.
g.join()
p.join()
# Protect entry point from being executed upon import (this matters
# on Windows).
if __name__ == "__main__":
main()
Although quite simple, this code would have various unwanted side-effects if
used with the canonical multiprocessing API instead of gipc.start_process()
and gipc.pipe()
. These side effects are described below in the
Challenges section.