diff --git a/README.md b/README.md index f03a289b..a9687950 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,19 @@ python3 -m cProfile -o profiler.bin tests/test.ui.004.py cprofilev -f profiler.bin # open http://127.0.0.1:4000 ``` +##### py-spy +```bash +# install +pip install py-spy + +# run the application +python3 demo/demo.py + +# on another terminal run the py-spy +sudo env "PATH=$PATH" \ + py-spy top \ + --pid $(ps -A -o pid,cmd | grep demo.py | grep -v grep | sed 's,python.*,,') +``` ##### pyroscope [pyroscope](https://pyroscope.io/) can be used as well for profiling diff --git a/tests/test.generic.006.weakref.01.py b/tests/test.generic.006.weakref.01.py new file mode 100644 index 00000000..e1e32126 --- /dev/null +++ b/tests/test.generic.006.weakref.01.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 + +# MIT License +# +# Copyright (c) 2023 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import weakref +import gc + +class C: + def method(self): + print("method called!") + return 1234 + +c = C() +r = weakref.ref(c.method) + +print(f"{r=}") +print(f"{r()=}") + +r = weakref.WeakMethod(c.method) + +print(f"{r=}") +print(f"{r()=}") +print(f"{r()()=}") + +del c + +print(f"{gc.collect()=}") + +print(f"{r()=}") + +def m3(): + print("Method 3") +m = m3 +l = lambda : print("lambda1") +r3 = weakref.WeakMethod(m3) + +r2 = weakref.WeakMethod(lambda : print("Method 2")) + +r2() +r3() diff --git a/tests/test.generic.006.weakref.02.py b/tests/test.generic.006.weakref.02.py new file mode 100644 index 00000000..acc1aebe --- /dev/null +++ b/tests/test.generic.006.weakref.02.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + +# MIT License +# +# Copyright (c) 2023 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import weakref +class Object: + pass + +kenny = Object() +weakref.finalize(kenny, print, "You killed Kenny!") + +del kenny \ No newline at end of file