【问题标题】:how to get a real callback from os in python3如何从python3中的操作系统获取真正的回调
【发布时间】:2013-08-18 08:24:11
【问题描述】:

我编写了 actionscript 和 javascript。添加回调来调用一段代码在日常生活中是很正常的。

但来到 python 似乎并不是一件容易的事。我几乎看不到写回调风格的东西。我的意思是真正的回调,不是假的,这是一个假的回调示例:

要下载的文件列表,你可以写:

urls = []

def downloadfile(url,callback):
    //download the file 
    callback()

def downloadNext():
    if urls:
       downloadfile(urls.pop(),downloadNext)

downloadNext()

这可行,但最终会满足最大递归限制。而真正的回调不会。

一个真正的回调,据我所知,不能不是来自程序,它必须来自物理,比如CPU时钟,或者一些硬件IO状态改变,这会调用一些对CPU的拦截,CPU中断当前操作流并检查运行时是否注册了有关此 int 的任何代码,如果有,运行它,操作系统将其包装为信号或事件或其他东西,最后将其传递给应用程序。(如果我错了,请指出)这样可以避免函数调用堆栈堆积溢出,否则会陷入无限递归。

python中有协程之类的东西来处理多任务,但必须非常小心。如果在任何一个例程中你被阻塞,所有任务都会被阻塞

有一些第三方库,例如twisted或gevent,但获取和安装似乎很麻烦,平台有限,在python 3中没有得到很好的支持,不适合编写简单的应用程序和分发。

多处理,繁重且仅适用于 linux

线程,因为GIL,从来都不是首选,而且似乎是伪线程。

为什么不 python 在标准库中提供一个实现?还有其他简单的方法来获得我想要的真正回调吗?

【问题讨论】:

  • 嗯,这是一个“真正的”回调。 JavaScript 的做法完全相同。
  • 在javascript中可以设置.onChange = func,在python中怎么写?
  • Python 不在浏览器中运行,所以你的问题并没有太大意义。
  • 您的意思是因为它们在不同的运行时中运行?如果python也在类似的环境中运行,那么我的问题会解决吗?

标签: python python-3.x callback operating-system


【解决方案1】:

您的示例代码只是顺序下载所有文件的一种复杂方式。

如果你真的想做异步下载,使用multiprocessing.Pool,尤其是Pool.map_async 成员函数。是最好的方法。请注意,这使用回调。

根据documentation进行多处理:

“它可以在 Unix 和 Windows 上运行。”

但是ms windows上的多处理确实有一些额外的restrictions

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2013-02-19
    • 2012-04-18
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多