Как я могу создать несколько потоков - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над python 3, и мой класс такой, как показано ниже.

class MyClass():
     def values(self):
        ***values***

     i =0
     def check_values(self):
         for i in ValueList[i:i+1]:
              self.server_connect()
              new_value = self.update.values(i)

      def run(self):
          self.check_values()

if __name__ == "__main__"
     format1 = "%(asctime)s: %(message)s"
     logging.basicConfig(format=format1, level=logging.INFO,
                        datefmt="%H:%M:%S")

     for i in range(4):
          thread = threading.Thread(target=MyClass().run())
          threads.append(thread)
          i += 1
          print("the %s thread is running", thread)
          thread.start()

Нет созданных потоков, но код работает. Я не могу понять, что я делаю здесь неправильно.

РЕДАКТИРОВАТЬ

Во-первых, я хотел бы поблагодарить вас за ответ и время дано за ответ. Я должен обновить код и наследовать другой класс в соответствии с новым обновлением от команды, как показано ниже.

class MyClass(MainServer):

Теперь у сервера есть собственная функция запуска, как показано ниже.

class MainServer(object):
   ***constructor***
   ***other functions ***
     def run(self):
         self.add_arguments()
         self.parse_arguments()
         self.check_values()

Теперь, без run () мой код не работает должным образом. в то время как включая run (), как показано ниже.

*** main ***
update_perform = MyClass()
for i range(4):
     thread = threading.Thread(target=Myclass().run()) <-- code starts from here 
     threads.append(thread)
     i += 1
     print("the %s thread is running", thread)
     thread.start()    <-- not reaching till here

Насколько я знаю, мне потребуется thread.start (), чтобы начать работу с потоками. Итак, я попробовал ниже вариант

class MyClass(MainServer):
     ***code as above***
   def check_values(self):
        self.server_authenticate()
        update_value = self.update.values()

    def run(self):
         self.server_connect()
         i = 0
         threads = list()
         for i in ValueList[i:i+1]:
             print("Updating the value = ", i)
             thread = threading.Thread(target=check_values(), args=[i])
             thread.start()
             i += 1
             print("Currently running thread", thread)
             threads.append(thread)
         for thread in threads:
              thread.join()

Здесь поток выполняется с начала и в печати, я вижу, как показано ниже

for threading :- 
Currently running threads = <Thread(Thread-8, stopped 14852)>

Но для значения, которое я вижу, только один в процессе как показано ниже

for value :- 
Updating the value = 10  <- first value 

Итак, теперь потоки могут создаваться, но значения не выполняются параллельно.

Что я не могу выяснить.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

изменить функцию запуска следующим образом

def run(self):
   self.check_values()
0 голосов
/ 17 марта 2020

Если вы хотите использовать threading класс, возможно, ваш класс должен быть таким:

class MyClass(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def check_values(self):
        for i in ValueList[i:i + 1]:
            self.server_connect()
            new_value = self.update.values(i)

    def run(self):
        self.check_values()

Кроме того, когда вы используете его, вы можете использовать:

thread = MyClass()
thread.start() # non-block thread

Или

thread = MyClass()
thread.join() # block thread
...