为什么asyncio call_later()在python中不起作用?

时间:2018-09-05 07:42:11

标签: python-3.x python-asyncio

这是我在python3.6中的代码

import asyncio
import time

class A():
    def __init__(self):
        print("A init")
        print("actvating1")
        loop = asyncio.get_event_loop()
        loop.run_until_complete(self.asyncFunc(loop))
        print("actvating2")
        time.sleep(2)
        print("actvating3")
        print("end")
        loop.close()
    def compute_pi(self):
        print("3.14???")

    async def asyncFunc(self,loop):
        loop.call_later(1, self.compute_pi, None)



if __name__== "__main__":
    a = A()

结果

A init
actvating1
actvating2
actvating3
end

预期结果

A init
actvating1
actvating2
3.14???
actvating3
end

我希望compute_pi(self)函数起作用。 PyCharm没有打印错误或警告。 我的小姐了解的关键是什么?

1 个答案:

答案 0 :(得分:1)

我认为问题是在您入睡时运行compute_pi的第二个进程已死。这是因为您使用call_later-asyncFunc在调用后保持运行,并由于异步而立即返回。这个

class A():
    def __init__(self):
        print("Actvating")
        loop = asyncio.get_event_loop()
        loop.run_until_complete(self.asyncFunc(loop))
        print("end")
        loop.close()

    def compute_pi(self):
        print("3.14???")

    async def asyncFunc(self,loop):
        print("Called")
        loop.call_later(1, self.compute_pi)
        await asyncio.sleep(2)

if __name__== "__main__":
    a = A()

打印3.14。如果删除sleep或缩短时间,则不会-进程已停止,因此您无法及时到达call_later。因此,无论等待时间长短,在run_until_complete外部进行睡眠都不会起作用。您必须保持循环本身处于活动状态,直到回调。