If an object could be garbage collected in parent process and if you do not to pass it to a child process, there is a possibility of its garbage collection. This can happen even if the child process is alive.
1def garbage_collect_noncompliant(self):
2 from multiprocessing import Pipe
3 pipe = Pipe()
4 try:
5 # Trigger a refresh.
6 self.assertFalse(
7 client._MongoReplicaSetClient__monitor.isAlive())
8
9 client.disconnect()
10 self.assertSoon(
11 lambda: client._MongoReplicaSetClient__monitor.isAlive())
12
13 client.db.collection.find_one()
14 except Exception:
15 traceback.print_exc()
16 pipe.send(True)
17
18
19def multiprocessing_noncompliant():
20 from multiprocessing import Process, Pipe
21 parent_connection, child_connection = Pipe()
22 # Noncompliant: fails to pass the parent process object to child processes.
23 process = Process(target=garbage_collect_noncompliant)
24 process.start()
1def garbage_collect_compliant(self, pipe):
2 try:
3 # Trigger a refresh.
4 self.assertFalse(
5 client._MongoReplicaSetClient__monitor.isAlive())
6
7 client.disconnect()
8 self.assertSoon(
9 lambda: client._MongoReplicaSetClient__monitor.isAlive())
10
11 client.db.collection.find_one()
12 except Exception:
13 traceback.print_exc()
14 pipe.send(True)
15
16
17def multiprocessing_compliant():
18 from multiprocessing import Process, Pipe
19 parent_connection, child_connection = Pipe()
20 # Compliant: parent process object is passed to its child processes.
21 process = Process(target=garbage_collect_compliant,
22 args=(child_connection,))
23 process.start()