【问题标题】:How to implement an asynchronous function in python 3如何在python 3中实现异步函数
【发布时间】:2020-06-19 17:19:01
【问题描述】:

我对整个编程非常陌生。对 C++ 和 HTML 有一些基本经验,比如简单的计算器和其他非常基本的东西(几个月前我开始自学),因此我什至不确定我是否正确地发布了这个问题。也许不言而喻,但我也是stackoverflow的新手(我的第一篇文章!),所以我可能在这里做错了一些事情,恳请您理解。任何建设性的批评都非常受欢迎!

所以这是我的问题:我正在尝试在 Python 3 中制作一个简单的聊天程序,但有一个问题:我想使用 python 的异步功能来允许用户在任何给定时间通过 esc 终止程序键被按下。我已经研究过一些库,例如 pynput、asyncio、tornado 和 getch()。但无论我如何更改我的代码,我似乎都无法在这里达到我的目标。

我创建了一个名为runalways() 的异步函数,它应该在程序的整个持续时间内运行,与其他函数并行。但它没有,我不知道为什么......

如果我不能正确解释我的问题,我很抱歉。有些术语和概念对我来说仍然相当模糊,但希望不会太久。我将留下到目前为止的代码,它可以很好地实现聊天功能,但仅此而已。此时异步位基本上不存在。

如果有人能解释我所缺少的,将不胜感激:

import time, asyncio
from msvcrt import getch


# Creates a chat-like effect
def typing(text):
    for i in text:
        print(i, end=" ")
        time.sleep(0.1)
    time.sleep(1.0)


# Terminates the program
def termination():
    print("Program terminated")
    time.sleep(0.5)
    SystemExit


# Defines async function to read pressed keys and terminate if Esc is pressed
# (Not working)
async def runalways():
    while True:
        print(ord(getch()))
        key = ord(getch())
        if key == 27:  # Esc
            termination()


# Initialize chatting
def startChat():
    typing("\nHello!\n")
    typing("How are you?\n\n")
    typing("Answer:\t")
    x = input()
    typing("\nAnyways, that isn't relevant right now.\n")
    time.sleep(0.5)
    typing("Can we get started?\n\n")
    typing("Answer(Y/N):\t")
    x = input()


# validates input
    while (x != "Y") & (x != "N"):
        typing("\nHey, don't go fooling around now. Keep it real! Try again.\n\n")
        typing("Answer(Y/N):\t")
        x = input()
    if (x == "Y") | (x == "y"):
        typing("\nThere you go! Now, let's go through the basics...\n\n")
        termination()

    elif (x == "N") | (x == "n"):
        typing("\nSorry to hear that... See you next time, then!")
        termination()


# Defines starter point for the program
def main():
    runalways()
    startChat()


main()

我会尽力澄清任何可能有助于理解我的问题的问题。提前致谢!

【问题讨论】:

  • 嘿!欢迎来到堆栈溢出!您提供了一个非常好的第一个问题,做得好!我做了一个小编辑,根据pep8 格式化代码并澄清这是特定于 Windows 的。 msvcrt 模块在 Linux 上不可用,所以我无法直接帮助您。有一件事,你导入了asyncio,但从未使用它,你是不是忘了从你的代码sn-p中删除它?
  • 您好!并感谢您的更正!我实际上在代码中使用过一次 asyncio,正确的是定义了 runalways() 函数。这个想法是让这个函数作为一个并行进程运行,这样如果用户在任何时候敲击键盘,该函数就会检查击键是否是 Esc,如果是,则终止程序。但老实说,我几乎不知道我在这里做什么,这对我来说是全新的,甚至可能有点太多了,但我还是决定去看看我能不能做到xD
  • 啊,是的,我很抱歉!我认为@Prune 会让你度过这个难关 :) 我只想留给你这个,非常相关的question

标签: python python-3.x windows asynchronous python-asyncio


【解决方案1】:

您有两个函数竞争获取输入。 runalways 想用getch 抓住他们,而你的主聊天循环正在尝试用input。两个进程冲突;每个角色只有一个可以消耗。每当一个线程抓取输入时,另一个线程就会为下一个输入申请缓冲区。

相反,您需要设置一个在 ESC 上立即终止的单个输入通道;否则,它会回显到终端并将字符传递给主循环(或将其缓冲直到出现 EOL)。

【讨论】:

  • 感谢您的回复!我想我明白你的意思......但更具体地说,你能否确认带有x = input() 的行是否与 getch() 方法冲突?我是否应该尝试重新制定,以便所有输入都通过 getch() 方法?
  • 是的,典型的方法是通过getch 运行所有内容,这是您需要的最低级别的输入处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多