在函数中调用多进程

问题描述 投票:0回答:1

问题是我调用函数 multiProcessCharacters ,它应该创建 3 个进程 3 次,因为它应该检查 3 个字符的 3 个特征。相反,这些进程“完成”并从我的 python 代码的开头重新启动。这是重要的代码,但不是全部:

#同时循环所有角色寻找每个特征组

character = [['1',False],['2',False],['3',False]]
while user!='n':
    user=input("Did you want to not roll any characters?\nEnter: 1/2/3/n\n1=Character One\n2=Character Two\n3=Character Three\nn=no\n")
    if user=='1':
        character[0][1]=True
    elif user=='2':
        character[1][1]=True
    elif user=='3':
        character[2][1]=True
    elif user=='n':
        print("Character rolling will start in 10 seconds!\n")
    else:
        print("Not a proper input")

#设置主要特征,然后设置你可以接受的次要特征/技能

while mainTraits[0][1]==False or mainTraits[1][1]==False or mainTraits[2][1]==False:
    time.sleep(10)
    print("Character rolling starts now!\n")
    print("Rolling for:\nUnbreakable\nCooking\nIncredible Immune System\n")
    for i in range(3):
        if character[i][1] == False:
            print("Starting character {i}")
            whichTrait = multiProcessCharacters(mainTraits,secondaryTraits,character[i][0])
            print("Character {i} Done!\n") 
            if whichTrait == '1':
                mainTraits[0][1]=True
            elif whichTrait == '2':
                mainTraits[1][1]=True
            elif whichTrait == '3':
                mainTraits[2][1]=True
            character[i][1] == True
        
    user=input("Are you happy with these characters? y/n\n")
    if user=='n':
        traitChosen=False
        characterChosen=False
        while characterChosen==False:
            characterChoice=input("Which character would you like to reroll? 1/2/3\n")
            if characterChoice=='1':
                character[0][1]=False
                characterChosen=True
            elif characterChoice=='2':
                character[1][1]=False
                characterChosen=True
            elif characterChoice=='3':
                character[2][1]=False
                characterChosen=True
            while characterChosen==True and traitChosen==False:
                traitChoice=input("Which trait would you like to reroll?\nUB\nCook\nISS")
                if traitChoice=="UB":
                    mainTraits[0][1]=False
                    traitChosen=True
                elif traitChoice=="Cook":
                    mainTraits[2][1]=False
                    traitChosen=True
                elif traitChoice=="ISS":
                    mainTraits[1][1]=False
                    traitChosen=True

#检查角色是否具备三个特质

def checkIfThreeTraits(characterLeft, characterRight):
    tripleTraitList=list(pyautogui.locateAllOnScreen(tripleTrait, grayscale=True, confidence=0.9))
    for i in range(0,len(tripleTraitList)):
        if tripleTraitList[i].left>characterLeft and tripleTraitList[i].left<characterRight:
                return True
    return False

#检查次要特征

def loopSecondaryTraits(mainTraitLoc,character,traits, characterLeft, characterRight):
    print("Checking secondary stuff\n")
    
    for trait in traits:
        if pyautogui.locateOnScreen(trait, grayscale=True, confidence=0.9) != None:
            traitLoc=pyautogui.locateOnScreen(trait, grayscale=True, confidence=0.9)
            if traitLoc.left>characterLeft and traitLoc.left<characterRight and traitLoc!=mainTraitLoc:
                if checkIfThreeTraits(character)==True:
                    return True
 return False
def searchMainTrait(trait, secondaryTraits, character):
    if character=='1':
        characterLeft = characterOneLeft
        characterRight = characterOneRight
    elif character=='2':
        characterLeft = characterTwoLeft
        characterRight = characterTwoRight
    elif character=='3':
        characterLeft = characterThreeLeft
        characterRight = characterThreeRight
    else:
        print("Character doesn't exist")
        exit(0)
        
    if pyautogui.locateOnScreen(trait, grayscale=True, confidence=0.9) != None:
        traitlocOne=pyautogui.locateOnScreen(trait, grayscale=True, confidence=0.9)
        if traitlocOne.left>characterLeft and traitlocOne.left<characterRight:
            found=loopSecondaryTraits(traitlocOne, character, secondaryTraits)
            if found==True:
                return True
    return False

def multiProcessCharacters(mainTraits, secondaryTraits, character):
    traitOne = mainTraits[0][0]
    traitTwo = mainTraits[1][0]
    traitThree = mainTraits[2][0]
    t1Found = mainTraits[0][1]
    t2Found = mainTraits[1][1]
    t3Found = mainTraits[2][1]
    
    if character=='1':
        pyautogui.moveTo(characterOneMousePosition)
    elif character=='2':
        pyautogui.moveTo(characterTwoMousePosition)
    elif character=='3':
        pyautogui.moveTo(characterThreeMousePosition)
    else:
        print("Character doesn't exist")
        exit(0)
    
    while t1Found==False or t2Found==False or t3Found==False:
        with concurrent.futures.ProcessPoolExecutor() as executor:
            if t1Found==False:
                print("Process 1 starting")
                f1 = executor.submit(searchMainTrait, traitOne, secondaryTraits, character)
                print("Process 1 ending")
            if t2Found==False:
                print("Process 2 starting")
                f2 = executor.submit(searchMainTrait, traitTwo, secondaryTraits, character)
                print("Process 2 ending")
            if t3Found==False:
                print("Process 3 starting")
                f3 = executor.submit(searchMainTrait, traitThree, secondaryTraits, character)
                print("Process 3 ending")
            if f1.result()==True:
                print("Pair One Done!\n")
                return '1'
            if f2.result()==True:
                print("Pair Two Done!\n")
                return '2'
            if f3.result()==True:
                print("Pair Three Done!\n")
                return '3'
        
        pyautogui.press(['t'])

我希望它能够循环并通过按 t 更改 3 个字符。我有可以工作的代码,但问题是它很慢,我希望多重处理能够使其更快地执行循环而不是一次执行一个循环。

python python-multiprocessing pyautogui
1个回答
0
投票

我通过添加一个解决了这个问题(注意!!它应该是名称和主要两侧的两个下划线,它们不应该是粗体 __ ):

if name == 'main':

在调用所有内容的主要代码部分前面。只需将其放在主程序的开头一次,如下所示:

if name == 'main':

teamNotMade=真 用户='y'

#Used for if three traits exist
tripleTrait = cv2.imread(r"Three_trait.png")
#Traits implemented
ISSTrait = cv2.imread(r"Traits/IIS_trait.png")
UBTrait = cv2.imread(r"Traits/UB_trait.png")
APLTrait = cv2.imread(r"Traits/APL_trait.png")
© www.soinside.com 2019 - 2024. All rights reserved.