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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.