使用定时 While 循环在 Python 中线程化

Threading in Python with Timed While Loop

之前有人问过类似的问题,但没有提供正确答案。

我正在尝试编写代码以测试 Python 中的线程,其中一个自动收报机每秒都在滴答作响。我正在尝试将名为 'clicking' 运行 的自动收报机函数保留在一个线程中,该线程的输出每秒连续增加一个。

import time
import threading
import queue

q = queue.Queue()

apple = 0
orange = 0    
rate = 1
clix = 0


def clicking(clix, rate):
    while True:
        time.sleep(1)
        clix += rate
        q.put(clix)

threading.Thread(target=clicking, args=(clix, rate)).start()
curr = q.get()
print(curr)

print('\nClicker Starting...')
endgame = False
while not endgame:

    print(f'Clix: {curr}')
    print('1. Apple : 10 clix | 2. Orange : 8 clix  |  3. Exit')
    ch = int(input('\nPurchase ID: '))

    if ch == 1 and curr >= 10:
        print(f'You have {curr} clix.')
        print('Got an Apple!')
        apple += 1
        rate += 1.1
        curr -= 10

    elif ch == 2 and curr >= 8:
        print('Got an Orange!')
        orange += 1
        rate += 1.2
        curr -= 8

    elif ch == 3:
        endgame = True
        stopflag = True
    else:
        print('Need more Clix')

但我的 otuput 始终为 1,而不是按定义的速率每秒递增。我错过了什么?我什至尝试用 return clix 代替 q.put(clix) 但没有用。

问题是您没有更新 while 循环内的 curr 变量。但是请注意,当您在 while 循环中写入“curr = q.get()”时,它将获得队列中的下一个值而不是最后一个值(正如我想您想要的那样)。我想更直接的方法是使用 time.time()

跟踪 while 循环内的秒增量
import time

apple = 0
orange = 0
rate = 1
clix = 0
curr = 0

last_ts = time.time()

print('\nClicker Starting...')
endgame = False
while not endgame:
    ts = time.time()
    curr += (ts - last_ts) * rate
    last_ts = ts

    print(f'Clix: {curr:.0f}')
    print('1. Apple : 10 clix | 2. Orange : 8 clix  |  3. Exit')
    ch = int(input('\nPurchase ID: '))

    if ch == 1 and curr >= 10:
        print(f'You have {curr:.0f} clix.')
        print('Got an Apple!')
        apple += 1
        rate *= 1.1 # I guess you meant x1.1
        curr -= 10

    elif ch == 2 and curr >= 8:
        print('Got an Orange!')
        orange += 1
        rate *= 1.2 # I guess you meant x1.2
        curr -= 8

    elif ch == 3:
        endgame = True
        stopflag = True
    else:
        print('Need more Clix')

这样你也可以正确退出,请注意,在你的示例中,即使循环中断线程也会继续。

但如果您想维护后台线程,我建议创建一个 class 并为当前计数器和 运行 条件存储 class 变量。