首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中没有线程的计时器?

在python中没有线程的计时器?
EN

Stack Overflow用户
提问于 2016-07-26 07:25:12
回答 2查看 1.2K关注 0票数 3

我是新编程,并想增加一个计数器,从你的分数每2秒扣减1。(因此,我必须尽快回答,以使我的分数增加)

代码语言:javascript
复制
chr
import random
import time
radians2 = None
ans = None
score = 0

radians1 = ['0', 'π/6', 'π/3', 'π/4', 'π/2', '2π/3', '3π/4', '5π/6', 'π', '7π/6', '4π/3', '5π/4', '3π/2', '5π/3', '7π/4', '11π/6', '2π']
while radians2 == ans or ans == None:

radians3 = (random.choice(radians1))
ans = input(radians3)
if radians3 == '0':
    radians2 = 0

elif radians3 == 'π/6':
    radians2 = 30

elif radians3 == 'π/3':
    radians2 = 60

elif radians3 == 'π/4':
    radians2 = 45

elif radians3 == 'π/2':
    radians2 = 90

elif radians3 == '2π/3':
    radians2 = 120

elif radians3 == '3π/4':
    radians2 = 135

elif radians3 == '5π/6':
    radians2 = 150

elif radians3 == 'π':
    radians2 = 180

elif radians3 == '7π/6':
    radians2 = 210

elif radians3 == '4π/3':
    radians2 = 240

elif radians3 == '5π/4':
    radians2 = 225

elif radians3 == '3π/2':
    radians2 = 270

elif radians3 == '5π/3':
    radians2 = 300

elif radians3 == '7π/4':
    radians2 = 315

elif radians3 == '11π/6':
    radians2 = 330

elif radians3 == '2π':
    radians2 = 360
score = score + 1

if radians2 == ans:
    print('Correct!')
    print "You've got %d in a row" % score
print "You lose, the correct answer was %d" % radians2

对不起,如果代码很乱/很长,我想基本上运行以下代码:

代码语言:javascript
复制
while 1:
     time.sleep(2)
     score = score - 1

唯一的问题是不能与程序的其他部分同时运行,线程(这似乎是另一种选择)让我非常困惑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-26 07:47:07

您可以使用以下代码启动新线程,并在它的run()方法中编写任何函数逻辑。

代码语言:javascript
复制
import threading
import time

class RepeatEvery(threading.Thread):
    def __init__(self, interval):

        threading.Thread.__init__(self)     
        self.interval = interval  # seconds between calls
        self.runable = True

    def run(self):
        global score # make score global for this thread context
        while self.runable:
            time.sleep(self.interval)
            if self.runable:     
                score = score - 1
                self.runable = False

    def stop(self):
        self.runable = False

上面的代码将迭代到线程可运行(self.runable= True),因此2秒后,分数将减少1,运行方法内的循环将中断,并将终止。

因此,为了调用上面的线程,请执行以下操作。

代码语言:javascript
复制
score_thread = RepeatEvery(2)
score_thread.start()    

这将调用线程构造函数init,并用2秒或从这里传递的任何值初始化interval变量。

为了同时停止线程,只需调用stop()方法即可。

代码语言:javascript
复制
score_thread.stop() 

您还可以调用join()方法,等待线程完成其执行。

代码语言:javascript
复制
score_thread.join() 

看上去不那么令人困惑

票数 1
EN

Stack Overflow用户

发布于 2016-07-26 07:48:57

如果不想使用任何线程,则可以使用corutine,每次调用生成器的下一个方法时,都会产生经过的时间:

代码语言:javascript
复制
def timer():
    prev_time = new_time = 0
    while True:
        prev_time, new_time = new_time, time.clock()
        time_delta = new_time - prev_time
        yield time_delta

>>> t = timer()
>>> t.next()
4.399568842253459e-06
>>> t.next()
1.7571719571481994
>>> t.next()
0.8449679931366727
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38583559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档