Bottom Page

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 Why doesn't gc delete an object without forcing a garbage collection call?
#1
Python 3.7.2

I created an event loop, run the task in it, but one of the objects wasn't deleted. After closing the event loop, I forced the garbage collection and in the debugger I finally got into the __del__ method of my object:
def __call__(self):
    loop = self._get_event_loop()
    try:
        loop.run_until_complete(self._create_workers())
    except Exception as err:
        print('Operation sucessfully failed!)
        raise err
    finally:
        #close the created event loop
        loop.close()
        
    gc.collect() #in this place object, created in event loop finally delete
If I place the call gc.collect() before closing the event loop, then the object will remain alive (I don’t get to the __del__ method and my data is not written to the database).

Why?
Quote
#2
see: https://docs.python.org/3/library/gc.htm...gc.collect
Quote:The free lists maintained for a number of built-in types are cleared whenever a full collection or collection of the highest generation (2) is run. Not all items in some free lists may be freed due to the particular implementation, in particular float.
Quote
#3
(Mar-13-2019, 05:43 PM)Larz60+ Wrote: see: https://docs.python.org/3/library/gc.htm...gc.collect
Quote:The free lists maintained for a number of built-in types are cleared whenever a full collection or collection of the highest generation (2) is run. Not all items in some free lists may be freed due to the particular implementation, in particular float.

You brought a good theoretical reference, but other questions worry me in the topic:
1. Why does garbage collection not start independently, but only after calling the collect() method?
2. Why is the collect() method effective only after closing the event loop?
Quote
#4
Quote:Why does garbage collection not start independently, but only after calling the collect() method?
Python schedules garbage collection automatically. You don't have to call collect.
I've written many thousands of lines of python code, and haven't been concerned in the least about garbage collection.
It's always performed as stated and has never caused a problem for me.
Quote
#5
(Mar-14-2019, 09:41 AM)Larz60+ Wrote:
Quote:Why does garbage collection not start independently, but only after calling the collect() method?
Python schedules garbage collection automatically. You don't have to call collect.
I've written many thousands of lines of python code, and haven't been concerned in the least about garbage collection.
It's always performed as stated and has never caused a problem for me.

if I don't call gc.collect() method __del__, which writing accumulated data in my database, not performed. But if I call it, then method __del__ calling and data writing successfully. This is evident not only by the debugger, but also by the presence of records in the database.
Quote
#6
__del__ is not guaranteed to run, even when Python exits. If you need to do cleanup external to your program, you need to manage that manually.
Feel like you're not getting the answers you want? Checkout the help/rules for things like what to include/not include in a post, how to use code tags, how to ask smart questions, and more.

Pro-tip - there's an inverse correlation between the number of lines of code posted and my enthusiasm for helping with a question :)
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  Forcing input from pre-defined list. scotty501 11 664 Jun-18-2019, 01:49 PM
Last Post: scotty501
  call dict object result key error lateublegende 2 333 May-15-2019, 01:08 PM
Last Post: lateublegende
  Why Can't I call base class function for my derived class object? AmirAB 2 357 Feb-13-2019, 03:04 PM
Last Post: snippsat
  Forcing a github push after major changes Larz60+ 10 2,964 Mar-30-2017, 05:58 PM
Last Post: Larz60+

Forum Jump:


Users browsing this thread: 1 Guest(s)