Как исправить проблему с многопоточностью, с которой я сталкиваюсь в Python - PullRequest
1 голос
/ 06 июня 2019

У меня есть ситуация, когда мне нужно вызвать два разных метода для параллельной работы. Я использую модуль потоков Python для достижения этой цели. Но вместо двух параллельно работающих методов они работают последовательно. Может кто-нибудь подсказать, что не так в моем коде?

Это для Python 3.5, использующего модуль потоков и имеющий класс с двумя разными методами, которые должны выполняться параллельно.

## This is in template.py
from threading import Thread
import time
class createTemplate:
    def __init__(self,PARAM1):
        self.PARAM1=PARAM1

    def method1(self):
        print("Method1-START")
        time.sleep(120)
        print("Method1-END")

    def method2(self):
        print("Method2-START")
        time.sleep(120)
        print("Method2-END")

    def final_method(self):
        if self.PARAM1=="1":
           m1=Thread(target=self.method1)
           m1.run()

        if self.PARAM1=="1":
           m2=Thread(target=self.method2)
           m2.run()

## This is in createTemplate.py
from template import createTemplate

template = createTemplate("1")
template.final_method()

Фактический объем производства:

Method1-START Method1-END Method2-START Method2-END

Ожидаемый результат:

Method1-START Method2-START Method1-END Method2-END

1 Ответ

1 голос
/ 06 июня 2019

вместо .run() вы должны позвонить .start()

Thread.run() выполнит код в контексте текущего потока, но Thread.start() фактически создаст новый поток и запустит код в нем параллельно с существующими потоками.

попробуйте это:

from threading import Thread
import time
class createTemplate:
    def __init__(self,PARAM1):
        self.PARAM1=PARAM1

    def method1(self, arg):
        print("Method1-START",arg)
        time.sleep(5)
        print("Method1-END",arg)

    def method2(self,arg):
        print("Method2-START",arg)
        time.sleep(5)
        print("Method2-END",arg)

    def final_method(self):
        if self.PARAM1=="1":
           m1=Thread(target=self.method1, args=("A", )) # <- this is a tuple of size 1
           m1.start()

        if self.PARAM1=="1":
           m2=Thread(target=self.method2, args=("B", )) # <- this is a tuple of size 1
           m2.start()
...