Инициализация параллельных объектов в python

#python #parallel-processing

Вопрос:

Обычно я бы использовал асинхронность с конкретными вызовами функций, а затем использовал ожидание. Но я не уверен, как реализовать это с помощью создания объектов. Я хочу запустить создание моих трех классов, а затем дождаться завершения всех функций инициализации. Так что мой вывод будет выглядеть так —

 First Class
Second Class
Third Class
First Class done
Second Class done
Third Class done
 

(порядок занятий не имеет значения)

 class First:
    def __init__(self, x):
        print("First Class")
        sleep(60)
        print("First Class done")

class Second:
    def __init__(self, x):
        print("Second Class")
        sleep(60)
        print("Second Class done")

class Third:
    def __init__(self, x):
        print("Third Class")
        sleep(60)
        print("Third Class done")
 
 def main():
    f = First(1)
    s = Second(2)
    t = Third(3)
    #await f,s,t init functions to finish.
 

Комментарии:

1. Используйте многопоточность

Ответ №1:

Для этого вы можете использовать потоки. Но будьте внимательны к ГИЛУ. Если вы действительно хотите повысить производительность, вам следует использовать подпроцессы. Но в любом случае вот код для вашей проблемы:

 import threading 
from time import sleep

class First:
    def __init__(self, x):
        print("First Class")
        #sleep(60)
        print("First Class done")
        self.x = x

class Second:
    def __init__(self, x):
        print("Second Class")
        #sleep(60)
        print("Second Class done")
        self.x = x

class Third:
    def __init__(self, x):
        print("Third Class")
        #sleep(60)
        print("Third Class done")
        self.x = x

def assign(lst,i,Class):
    lst[i] = Class(i)

def main():
    lst = [None,None,None]
    t1=threading.Thread(target=assign,args=[lst,0,First])
    t2=threading.Thread(target=assign,args=[lst,1,Second])
    t3=threading.Thread(target=assign,args=[lst,2,Third])
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
    print(lst[0].x,lst[1].x,lst[2].x)
    
if __name__ == "__main__":
    main()
 

Комментарии:

1. Спасибо! Я рассмотрю подпроцессы, потому что каждый из этих классов очень интенсивен.