Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiprocessing - tkinter pipeline communication

I have a question on multiprocessing and tkinter. I am having some problems getting my process to function parallel with the tkinter GUI. I have created a simple example to practice and have been reading up to understand the basics of multiprocessing. However when applying them to tkinter, only one process runs at the time. (Using Multiprocessing module for updating Tkinter GUI) Additionally, when I added the queue to communicate between processes, (How to use multiprocessing queue in Python?), the process won't even start.

Goal: I would like to have one process that counts down and puts the values in the queue and one to update tkinter after 1 second and show me the values.

All advice is kindly appreciated

Kind regards, S

EDIT: I want the data to be available when the after method is being called. So the problem is not with the after function, but with the method being called by the after function. It will take 0.5 second to complete the calculation each time. Consequently the GUI is unresponsive for half a second, each second.

EDIT2: Corrections were made to the code based on the feedback but this code is not running yet.

class Countdown(): 
    """Countdown prior to changing the settings of the flows"""

    def __init__(self,q):

        self.master = Tk()
        self.label = Label(self.master, text="", width=10)
        self.label.pack()
        self.counting(q)

    # Countdown()
    def counting(self, q):
        try:
            self.i = q.get()
        except:
            self.label.after(1000, self.counting, q)

        if int(self.i) <= 0:
            print("Go")
            self.master.destroy()

        else:
            self.label.configure(text="%d" % self.i)
            print(i)
            self.label.after(1000, self.counting, q)

def printX(q):
    for i in range(10):
        print("test")
        q.put(9-i)
        time.sleep(1)
    return


if __name__ == '__main__':
    q = multiprocessing.Queue()

    n = multiprocessing.Process(name='Process2', target=printX, args = (q,)) 
    n.start() 

    GUI = Countdown(q)
    GUI.master.mainloop()
like image 466
Stijn Van Daele Avatar asked Mar 17 '17 08:03

Stijn Van Daele


People also ask

How to communicate between 2 processes Python?

Passing Messages to Processes A simple way to communicate between process with multiprocessing is to use a Queue to pass messages back and forth. Any pickle-able object can pass through a Queue. This short example only passes a single message to a single worker, then the main process waits for the worker to finish.

What is pipe multiprocessing?

In multiprocessing, a pipe is a connection between two processes in Python. It is used to send data from one process which is received by another process. Under the covers, a pipe is implemented using a pair of connection objects, provided by the multiprocessing. connection. Connection class.

How does multiprocessing queue work?

A queue is a data structure on which items can be added by a call to put() and from which items can be retrieved by a call to get(). The multiprocessing. Queue provides a first-in, first-out FIFO queue, which means that the items are retrieved from the queue in the order they were added.

How do you know if a multiprocessing queue is empty?

The empty() method checks if a multiprocessing queue is empty if the method returns True if the queue is empty. Otherwise, it returns False .

How to communicate between process with multiprocessing in Python?

Queue : A simple way to communicate between process with multiprocessing is to use a Queue to pass messages back and forth. Any Python object can pass through a Queue. Note: The multiprocessing.Queue class is a near clone of queue.Queue. print("Queue is now empty!")

How does Tkinter work with Python?

This is a simple example of a python application with a tkinter GUI in a main process that spawns a "worker" process. The worker process periodically communicates with the main process via a multiprocess.Queue. multiprocess.Value is used as well for setting a bool value that indicates whether or not the second process should stop.

Why is Tkinter multithreading so bad?

Tkinter has some well-known quirks that create problems with multithreading. First - the UI thread must be run on the main thread - and when you call tk.mainloop (), the main thread goes into a UI message-processing loop and doesn't return until the window closes.

What is Multiprocessing pipe () function in Python?

multiprocessing module provides Pipe () function which returns a pair of connection objects connected by a pipe. The two connection objects returned by Pipe () represent the two ends of the pipe.


2 Answers

Multiprocessing does not function inside of the interactive Ipython notebook. Multiprocessing working in Python but not in iPython As an alternative you can use spyder.

like image 95
Stijn Van Daele Avatar answered Nov 15 '22 04:11

Stijn Van Daele


No code will run after you call mainloop until the window has been destroyed. You need to start your other process before you call mainloop.

like image 40
Bryan Oakley Avatar answered Nov 15 '22 03:11

Bryan Oakley