简体   繁体   中英

(Multithreading-Python) How I can create a script that run two scripts which I usually run from two different terminals?

I have two scripts a.py and b.py , they send data to each other via a local host (mqtt), and they both depend from a configuration file conf.jso n. I usually execute them in two different terminals,

  • a.py in one terminal
  • b.py in another

and everything it's OK. I am trying right now to create another script c.py which should do the following:

  • for parameter in parameters
  • update config.json
  • execute a.py and b.py "in two different terminals"
  • close a.py , b.py and start again with the new parameters

Now, I am very noob about this, so I tried to use Thread from threading

from threading import Thread

for parameter in parameter 
    #update config.json
    class exp(Thread):
        def __init__(self, name):
            Thread.__init__(self)
            self.name = name
        def run(self):
            if self.name == 0:
               a.runs()
            else:
               b.runs()
    thread1 = exp(0)
    thread1.start()
    thread2 = exp(1)
    thread2.start()

a.py and b.py scripts both end by:

def runs():
    #whatever runs do
if __name__ = 'main':
   runs()

It runs without errors, but it does not work. I am quite sure there should be a nice and standard solution to this problem. Any ideas? Thanks!

You probably want multiprocessing , not the threading library (look up multiprocessing.Process . Another fairly equivalent option is to use subprocess.call to launch the two scripts via shell.

Regarding threads - Keep in mind they are limited due to the Global Interpreter Lock in CPython - which is the prevalent python implementation and the one you probably are using.

So I eventually found this (dirty) solution...any advices for improvements?

p = subprocess.Popen(['python', 'random.py']) #initialize a random process just to make sense of the firsts terminate calls in the for cycle. 
for parameter in parameters
    subprocess.Popen.terminate(p)
    #random code
     p = subprocess.Popen(['python', 'a.py'])
     p = subprocess.call(['python', 'b.py'])
    #here I would like to do
    #subprocess.Popen.terminate(p)....but it does not work, so I putted the terminate process at the start of the for cycle

I do not totally understand what I wrote but it works fine. Thanks everybody for previous tips, and I hope for further explanations.

you can us qt Threading. Qt has a very powerful library exactly for this purpose.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM