Garbage collection prevention in multiprocessing Medium

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.

Detector ID
python/multiprocessing-garbage-collection-prevention@v1.0
Category
Common Weakness Enumeration (CWE) external icon
-

Noncompliant example

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()

Compliant example

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()