Правильно ли использовать логи c потоков внутри потоков в python? - PullRequest
0 голосов
/ 22 апреля 2020

Я новичок в python, и я пытаюсь создать приложение, которое запускает поток для создания GUI (с помощью tkinter), и идея в том, что GUI показывается пользователю В фоновом режиме программа выполняет несколько вызовов API.

Я пробовал разные способы заставить программу делать то, что она должна делать, но единственный способ добиться желаемого поведения - использовать поток для GUI и поток, предназначенный для функции, в которой создаются потоки для выполнения вызовов API.

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

Мой вопрос: действительно ли это хорошая практика - использовать потоки внутри потока? Действительно ли это повышает производительность крупной операции, например нескольких вызовов API?

Я протестировал приложение с несколькими вызовами API, такими как 15 или 20, и оно работает, но я ожидаю обработки от 1000 на 1 000 000 вызовов API.

Вот мой код

#There is another function which calls get_all_data
#We are working in the main thread
#list_of_compounds and list_of_diseases are both string arrays
def get_all_data(list_of_compounds,list_of_diseases):

    #create an object of class SearchData (where the API calls and the gui are defined)
    obj=SearchData()

    #Create a thread to handle a GUI (I'm using tkinter)
    show_screen=threading.Thread(target=obj.gui)

    #Create a thread to handle API calls
    getData=threading.Thread(target=obj.startSearch,args=(list_of_compounds,list_of_diseases))

    #start the thread to handle API calls
    #I don't know why, but if I START THE show_screen THREAD FIRST, THE GUI I MADE IS NOT DISPLAYED UNTIL 
    #THE getData THREAD HAS FINISHED.
    getData.start()

    #start the gui
    show_screen.start()

А вот класс SearchData:

class SearchData:
    def __init__(self):
        #Here is where I define the widgets of the GUI (definition)
        #   .
        #   .
        #   .

    def gui(self):
        #Here is where I display the GUI (implementation)
        #   .
        #   .
        #   .

    def startSearch(self,compounds,diseases):   #The compounds array or the diseases array are expected to have more
                                                #than 10,000 elements
        #Lists for the threads
        compounds_threads=list()
        disease_threads=list()

        for item in compounds:      #I'm creating a thread for each element in the compounds array
            compound=threading.Thread(target=get_drug_data)
            compounds_threads.append(compound)  #save the thread in a list to use in the next for cycle (to join)
            compound.start()

        for item in enumerate(compounds_threads):
            item.join()

        for item in diseases:       #I'm creating a thread for each element in the diseases array
            disease=threading.Thread(target=get_disease_data)
            disease_threads.append(disease) #save the thread in a list to use in the next for cycle (to join)
            disease.start()

        for item in enumerate(disease_threads):
            item.join()

Как видите, поток getData создает темы, но я не знаю, действительно ли это улучшает производительность. Я прочитал несколько постов здесь, в StackOverflow, где люди говорят, что создавать потоки внутри потока не очень хорошая идея, потому что потоки будут использовать одну и ту же память, ресурсы и т. Д. c.

...