Re: Possible memory leak with signal connections
Phil Thompson <[email protected]>
| Newsgroups | gmane.comp.python.pyqt-pykde |
|---|---|
| Message-ID | <[email protected]> |
On 19/09/2019 19:53, Kevin Keating wrote: > I've found what appears to be a memory leak caused by connecting > signals to slots that lack a QtCore.pyqtSlot decorator. I know that > connections without the pyqtSlot decorator are expected to use more > memory than connections with the decorator based on > https://www.codeproject.com/Articles/1123088/PyQt-signal-slot-connection-performance. > In the script I've pasted below, though, connections without the > pyqtSlot decorator continue to consume memory even after the signal > has been disconnected and the QObjects have been discarded. The > script does the following: > - Instantiates a bunch of SignalObjects, which are QObjects with a > signal, and stores the SingalObjects in a list. > - Instantiates a bunch of SlotObjects, which are QObjects with > slots. Each SlotObject slot is connected to the signals from all the > SignalObjects. The SlotObjects are then immediately discarded. > - Discards all SignalObjects. > - Runs gc.collect() > - Runs the QApplication's event loop for a second in case there are > any pending DeferredDelete events. > > If the SlotObject class uses the QtCore.pyqtSlot decorator, then > memory usage at the end of the script is the same as what it was at > the beginning of the script, which makes sense since all the objects > that get created should be completely destroyed before the script > finishes. Here's the output that I get with pyqtSlot decorators: > Memory before signal_objects creation: 17.1MiB > Memory before slot objects creation: 17.1MiB > Difference: 0.0B > Memory after slot objects creation: 17.1MiB > Difference: 0.0B > Memory after event loop runs: 17.1MiB > Difference: 0.0B > If the SlotObject class doesn't use the QtCore.pyqtSlot decorator, > though, then memory usage at the end of the script is substantially > higher. Here's the output that I get without pyqtSlot decorators: > Memory before signal_objects creation: 17.0MiB > Memory before slot objects creation: 17.0MiB > Difference: 0.0B > Memory after slot objects creation: 210.6MiB > Difference: 193.5MiB > Memory after event loop runs: 210.6MiB > Difference: 193.5MiB > Is this expected behavior? Without pyqtSlot decorators, is there > anything I can do to recover the 193 MiB of memory other than > terminating the process? Thanks! > > I've tested the script with Python 3.6.2, PyQt 5.12.2, and Qt 5.12.3 > on Windows 10, Linux, and Mac OS. I've also tested with Python 3.6.5, > PyQt 5.13.1, and Qt 5.13.1 on Windows 10. All of them give similar > results. The script requires the psutil package > (https://pypi.org/project/psutil/) to monitor memory usage. Are you expecting that the Python interpreter will return unused memory to the operating system? Phil _______________________________________________ PyQt mailing list [email protected] https://www.riverbankcomputing.com/mailman/listinfo/pyqt