gpt4 book ai didi

python - Python 解释器使用什么机制来进行事件驱动编程?

转载 作者:行者123 更新时间:2023-11-30 22:20:29 26 4
gpt4 key购买 nike

我是事件驱动编程的新手,我真的很想更好地了解当 CPython 解释器逐行执行代码时幕后发生的情况。到目前为止,我只按顺序进行编程,并且我对解释器如何将我的代码转换为字节码,然后从一个语句转到下一个语句并执行命令有一个相当好的想法。

但是对于事件驱动的编程,我完全困惑解释器是如何工作的。

我特别困惑

  1. 解释器如何知道源代码中下一步跳转到哪里

  2. 以及当某些事件发生时如何调用函数处理程序

  3. 事件循环的刷新率是如何处理的:实际上函数句柄的所有代码每秒运行数千次,但由于某种“事件尚未发生”标志而没有执行说“现在不执行这个函数”?

为了使讨论更加具体,您能否在以下示例中说明这些观点(取自 site) :

from Tkinter import *

ROOT = Tk()

def ask_for_userinput():
user_input = raw_input("Give me your command! Just type \"exit\" to close: ")
if user_input == "exit":
ROOT.quit()
else:
label = Label(ROOT, text=user_input)
label.pack()
ROOT.after(0, ask_for_userinput)

LABEL = Label(ROOT, text="Hello, world!")
LABEL.pack()
ROOT.after(0, ask_for_userinput)
ROOT.mainloop()

理想情况下,我想要一个与 this 类似的解释这篇文章从 CPython 解释器如何工作、为什么有些语句是线程安全的而有些不是、以及如何实现线程安全的角度进行了精彩的解释。

最佳答案

事件循环所做的就是在事件发生时调用其他函数。图形子系统通过向事件循环发出事件正在等待处理的信号来提供帮助。

键盘输入和鼠标交互(移动指针、单击)等事件均由图形子系统 (GUI) 和操作系统 (OS) 处理。键盘和鼠标都是硬件设备,电脑使用interrupts记录它们的状态以便 GUI 拾取。

如果你不碰键盘或鼠标,事件循环就什么也不做;循环阻塞,操作系统将执行其他进程,因为循环已发出信号,它正在等待某些事情发生。此时操作系统处于控制状态,该进程不会获得任何 CPU 时间,而是由其他进程运行。一旦发生某些事情,队列中就会有事件,操作系统可以恢复该进程。想象一下事件循环中的一个函数调用,询问是否有更多事件,并且该调用在有更多事件之前不会返回。

一旦循环恢复,队列中就会有事件需要处理(“鼠标位置现在是 x、y”、“键盘输入队列包含字符 F、O 和 O”)。每个事件都可以触发您编写并注册为在该事件上运行的代码。例如,您可以注册一个处理程序,以便在单击按钮时运行;事件框架有一个注册表,如果条件正确(发生“鼠标按钮单击”事件,光标位于屏幕上的正确位置,按钮处于事件状态且可见),那么就知道调用您的自定义事件处理程序。

这样的事件处理程序是完全同步的,如果处理程序需要很长时间才能完成,您会发现您的 GUI“卡住”,不执行任何其他操作,因为 Python 太忙于运行该事件处理程序处理程序。在这种情况下,通常的解决方法是使用线程;您的事件处理程序快速启动一个单独的线程来完成实际工作,然后返回。这样,主线程(带有事件循环)就可以处理下一个事件,而操作系统则在额外线程和主线程中的工作之间切换。

至于您发布的具体代码段,这实际上不是一个很好使用的示例。它主动忽略 GUI 输入,而是使用raw_input() 函数从控制台捕获键盘输入。每次函数运行时,GUI 都会被完全阻塞!

ask_for_userinput() 函数一个事件处理程序,它与after() method 注册为一个。 。 after() 使用计时器中断(通常使用 SIGALRM interrupt 实现)在至少 0 秒过去后调用(所以尽快,真的) 。每次调用它时,它都会向 GUI 添加一个新标签(只是一段文本)并重新安排自身。这不是很有趣!

关于python - Python 解释器使用什么机制来进行事件驱动编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48841699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com