【问题标题】:Wait until condition is met等到满足条件
【发布时间】:2022-02-04 20:00:45
【问题描述】:

我对 Python 还是很陌生。我有一些使用Thread 的代码,它应该停止,直到满足条件。

当我在控制台中按下键 1 时,脚本会停止,而不是在 test1 == 1: 条件下运行该部分。

满足条件时,我想在现有会话中每个线程仅运行 1 次脚本


代码:

  def test()

    #some code  
    test1 = 0

    while (test1 == 1): #Wait until is set 1 in if __name__ == '__main__': and run the code only 1 time 
        response = session.get('https://www.example.com/')


        opts = ChromeOptions()
        opts.add_experimental_option("detach", True)
        driver = Chrome(chrome_options=opts)

        driver.get(response.url + '#/checkout/login')
        print "Checking Out..."
        test1+=1

def Main():
        t1 = Thread(target=test, args=())
        t1.start()


if __name__ == '__main__':
    test = input('How many tasks you want to start? \n')
    for i in range(test):
        Main()
    test1 = input('Proceed? if yes press 1 \n')

【问题讨论】:

  • test1 = 0 ... while (test1 == 1):,循环永远不会运行,因为test1 不等于 1
  • while 不代表wait
  • 在脚本的最后一行你可以看到,我设置了 test1 = 1,所以循环应该运行然后
  • 你永远不会到达test1 +=1,因为你从来没有进入循环开始。
  • 您似乎期望while(p): 循环直到条件为真。那完全是倒退。如果您希望循环运行直到条件为真,您希望它在 false 时运行。因此,您似乎期望while(p) 的行为类似于while(not p)。在你的情况下,你似乎真的想要while(test1 != 1):

标签: python multithreading


【解决方案1】:

如果您只想运行一次代码,那么为什么要使用循环。 只需简单地指定没有循环的代码。

response = session.get('https://www.example.com/')
opts = ChromeOptions()
opts.add_experimental_option("detach", True)
driver = Chrome(chrome_options=opts)
driver.get(response.url + '#/checkout/login')
print "Checking Out..."
test1+=1

或者你可以指定你的while语句。

While True:
    // Logic
    break # once logic finely executed, then break the loop

While 循环将执行给定的语句块,直到条件变为 False。在您的情况下,while 条件始终为 False,因此在初始控制阶段本身,while 块将被跳过。

【讨论】:

  • 是的,但是当我在没有循环的情况下运行代码时,它只是在没有任何条件的情况下运行。我希望它在它问我“你会继续吗?”之后运行。然后我输入一个值,当循环满足条件时,代码应该在现有会话的每个线程中运行一次
【解决方案2】:
  checker = 0
  placeHolder = 0


   def Main():
       global test
       global checker
       global placeHolder

       if checker == 0:
         t1 = Thread(target=test, args=())
         t1.start()

       while placeHolder <= test:            

         response = session.get('https://www.example.com/')


         opts = ChromeOptions()
         opts.add_experimental_option("detach", True)
         driver = Chrome(chrome_options=opts)

         driver.get(response.url + '#/checkout/login')
         print "Checking Out..."

         placeHolder +=1






if __name__ == '__main__':
    test = input('How many tasks you want to start? \n')
    Main()

【讨论】:

  • 我的意思是每个线程一次。当我有 7 个线程时,它应该运行 7 次。这段代码一般会运行一次。
  • 嗯让我看看。
  • 测试后告诉我。它也像一个while循环:)但更快
  • 其中有一些错误:UnboundLocalError: local variable 'placeHolder' referenced before assignment。会议呢?然后它应该继续每个线程的会话,而不是为每个线程启动一个新会话。那么它会保持会话吗?
  • 在顶部的主函数中,我将 placeHolder "h" 设为小写而不是大写
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2018-01-27
  • 2012-01-10
  • 2018-08-09
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多