如何在python3中从os获得真正的回调

时间:2013-08-18 08:24:12

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

我写了动作脚本和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中有一些像coroutine来处理多个任务,但必须非常小心。如果你被阻止的任何例程,所有任务都将被阻止

有一些第三方库像twisted或gevent,但是在python 3中获取和安装,平台有限,不太受支持似乎非常麻烦,它不适合编写一个简单的应用程序并分发。

多处理,很重,只能在linux上运行

线程,因为GIL,永远不会是第一选择,它似乎是伪造的。

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

1 个答案:

答案 0 :(得分:0)

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

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

根据documentation进行多处理:

  

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

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