почему asyncio call_later () не работает в Python? - PullRequest
0 голосов
/ 05 сентября 2018

Вот мой код на 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 голосов
/ 05 сентября 2018

Мне кажется, проблема в том, что второй запущенный процесс 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 не будет работать, независимо от периода ожидания. Вы должны поддерживать сам цикл до обратного вызова.

...