使用定时 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 变量。
之前有人问过类似的问题,但没有提供正确答案。
我正在尝试编写代码以测试 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 变量。