Я новичок в 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.