Tkinter deadlock on graceful exit

Matteo Landi matteo at matteolandi.net
Wed May 30 18:19:25 EDT 2012


On May/28, Matteo Landi wrote:
> Hi list,
> recently I started to work on an application [1] which makes use of the Tkinter
> module to handle interaction with the user.  Simply put, the app is a text
> widget displaying a file filtered by given criteria, with a handy feature that
> the window is raised each time a new line is added to the widget.
> 
> The application mainly consists of three threads:  the first one, the file
> processor, reads the file, filters the lines of interest, and pushes them into
> a shared queue (henceforth `lines_queue`);  the second one, the gui_updater,
> pops elements from `lines_queue`, and schedule GUI updates using the
> `after_idle` method of the Tkinter module;  finally the last one, the worker
> spawner, receives commands by the gui (by means of a shared queue,
> `filters_queue`), and drives the application, terminating or spawning new
> threads.
> 
> For example, let's see what happens when you start the application, fill the
> filter entry and press Enter button:
> 1 the associated even handler is scheduled (we should be inside the Tkinter
>   mainloop thread), and the filter is pushed into `filters_queue`;
> 2 the worker spawner receives the new filter, terminate a possibly running
>   working thread, and once done, create a new file processor;
> 3 the file processor actually processes the file and fills the `lines_queue`
>   with the lines matching given filter;
> 4 the gui updater schedules GUI updates as soon as items are pushed into
>   `lines_queue`
> 5 Tkinter mainloop thread updates the gui when idle
> 
> What happens when the main window is closed?  Here is how I implemented the
> graceful shutdown of the app:
> 1 a quit event is scheduled and a _special_ message is pushed into both
>   `filter_queue` and `lines_queue`
> 2 the gui updater threads receives the _special_ message, and terminates
> 3 the worker spawner receives the message, terminates the working thread and
>   interrupts her execution.
> 4 Tk.quit() is called after the quit event handler, and we finally quit the
>   mainloop
> 
> Honestly speaking, I see no issues with the algorithm presented above;  however,
> if I close the window in the middle of updates of the text widget, the
> applications hangs indefinitely.  On the other hand, everything works as
> expected if I close the app when the file processor, for example, is waiting for
> new content to filter.
> 
> I put some logging messages to analyze the deadlock (?!), and noticed that both
> the worker spawner and the file processor are terminated correctly.  The only
> thread still active for some strange reasons, is the gui updater.
> 
> Do you see anything wrong with the description presented above?  Please say so,
> because I can't figure it out!
> 
> 
> Regards,
> Matteo
> 
> [1] https://bitbucket.org/iamFIREcracker/logfilter
> 
> -- 
> http://www.matteolandi.net

Bump

-- 
http://www.matteolandi.net



More information about the Python-list mailing list