首页 新闻 会员 周边

python如何在一个方法延时的时候,不影响另一个正常运行。

0
[已解决问题] 解决于 2017-11-30 15:35
复制代码
def a():
    print('11')
    print('22')
    time.sleep(3)
 
def b():
    print('aa')
    time.sleep(70)

if __name__ == "__main__":
    while 1:
        a()
        b()
复制代码

 

如何在b延时70秒的时候,a能正常输出

 

现在的情况 是b等待70秒的时候,整个程序是停止70秒。

 

想在b等待70秒时,不影响a。

 

想不到办法了。。

谢谢

问题补充:

进程 和线程,不行,会出错,已经试过了

有别的方法吗

还没有的主页 还没有 | 小虾三级 | 园豆:531
提问于:2017-11-17 10:51
< >
分享
最佳答案
0

两种方法。
1.多线程
2.等待。不要直接用sleep,而是用变量记录一段循环两个端点的时间,利用中间的时间差来控制等待时间,这个方法在游戏中运用得比较多一点(deltatime)

奖励园豆:5
Compasslg | 菜鸟二级 |园豆:209 | 2017-11-19 03:00

第一个不行。

第二个不明白

还没有 | 园豆:531 (小虾三级) | 2017-11-22 22:37

@还没有: 第一个可以的,只是用法不对。

以下是第二个思路最简单的例子

import time
def a():
    print('11')
    print('22')
 
def b():
    print('aa')

if __name__ == "__main__":
    a_wait = 3
    b_wait = 70
    while True:
        time.sleep(1)
        a_wait -= 1
        b_wait -= 1
        if a_wait == 0:
            a()
            a_wait = 3
        if b_wait == 0:
            b()
            b_wait = 70
        

由于你给的程序很简单且对时间的计算都是以秒为单位,只需要每次等待一秒,当达到三秒或者七十秒的时候执行相应的函数就好了,所以我直接使用的1秒作为deltatime。如果涉及到更精确的时间,则还是需要用time.time()来计算循环初始时间,然后在循环结尾计算中间的时间差来获得更精准的deltatime。

毕竟循环中其他的代码会造成误差,这样就不能直接等待一秒了

Compasslg | 园豆:209 (菜鸟二级) | 2017-11-23 00:00
其他回答(3)
0

python应该有多线程和future的东西吧。

Daniel Cai | 园豆:10424 (专家六级) | 2017-11-17 11:08
0

进程线程协程派生

北方姆Q | 园豆:1118 (小虾三级) | 2017-11-17 11:13

进程 和线程,不行,会出错,已经试过了

支持(0) 反对(0) 还没有 | 园豆:531 (小虾三级) | 2017-11-18 10:13

协程也不行,

因为有sleep,执行到这,总要等b的70秒后,才继续,

支持(0) 反对(0) 还没有 | 园豆:531 (小虾三级) | 2017-11-18 11:01

@还没有: 那只能说你写错了,不是这些方法的问题

 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 # __author__ = '北方姆Q'
 4 
 5 from threading import Thread
 6 import time
 7 
 8 
 9 def a():
10     print('a start')
11     time.sleep(3)
12     print('a is ok')
13 
14 
15 def b():
16     print('b start')
17     time.sleep(10)
18     print('b is ok')
19 
20 
21 t1 = Thread(target=a)
22 t2 = Thread(target=b)
23 t1.start()
24 t2.start()
25 t1.join()
26 t2.join()
27 
28 
29 from gevent import monkey; monkey.patch_all()
30 import gevent
31 import time
32 
33 
34 def a():
35     print('a start')
36     time.sleep(3)
37     print('a is ok')
38 
39 
40 def b():
41     print('b start')
42     time.sleep(10)
43     print('b is ok')
44 
45 gevent.joinall([
46     gevent.spawn(a),
47     gevent.spawn(b),
48 ])

 

支持(0) 反对(0) 北方姆Q | 园豆:1118 (小虾三级) | 2017-11-20 09:59

@北方姆Q: 不能使用线程

支持(0) 反对(0) 还没有 | 园豆:531 (小虾三级) | 2017-11-22 22:38

@还没有: 下面那个是协程

支持(0) 反对(0) 北方姆Q | 园豆:1118 (小虾三级) | 2017-11-23 09:59
0

import threading

Masako | 园豆:1893 (小虾三级) | 2017-11-17 11:14

进程 和线程,不行,会出错,已经试过了

支持(0) 反对(0) 还没有 | 园豆:531 (小虾三级) | 2017-11-18 10:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册