【发布时间】:2020-05-19 01:14:13
【问题描述】:
我正在编写一个 Fusion 360 python 插件,这是一种事件驱动的方式来扩展他们的产品(他们的代码调用我的函数来连接到他们的事件)。
在我的代码中,我想在不让用户等待的情况下向远程服务器发送一个 HTTP GET(或 POST)请求(例如,如果他们离线,我不希望延迟 - 它只需要静默失败) .
周围有很多异步示例,但所有这些示例似乎都要求您运行“正常”程序,并且程序的每个部分都是异步开始的(即我找不到任何常规程序的示例,添加了异步位)。
我是 python 新手,异步 Doc 快把我淹没了 :-(
也就是说 - 我确实知道我在用其他语言做什么,并且我了解进程是如何工作的(虽然没有那么多线程)。
我确实设法用这个部分“解决”了我自己的问题:
subprocess.Popen([get_exec(),os.path.join(prog_folder,"send_data.py"),str(VERSION)])
还有第二个脚本——除了弹出一个丑陋的黑色“DOS”框外,它一直挂着直到传输完成,看起来非常不专业。所有避免黑匣子的尝试都失败了(我没有指定我的用户环境的奢侈,并且没有发布有效的“windows UI build”python版本。)
所以基本上 - 两个问题
a) 事件驱动的 python 函数甚至有可能“生成”一个线程吗?或许可以这样想象:你已经编写了一个 python 模块,任何调用者都可以调用你模块中的一个函数,该函数会立即返回,但是你的函数随后会继续并行工作一分钟 - 但至关重要的是 - 调用者不需要做任何特别的事情。
b) 假设它或多或少是可能的 - 任何人都可以给我一个提示或指向一个示例的指针,或者某些东西可能会给我一个从哪里开始的线索?
Python 3.7.6+ 是我的最低环境。
我的主要问题(请原谅双关语)是我能找到的所有示例都是这样做的:
loop.run_until_complete(asyncio.wait(print_http_headers(url)))
或者这个:
asyncio.run(main())
这两个块。甚至 asyncio 文档的“hello world”示例也是非异步的(如果 only 他们首先打印“world”(延迟 1 秒后),然后第二次打印“hello”,没有延迟 -那本来可以解决一切的!!!)
感激地收到所有其他建议(肯定会有一个“盒子外”的替代方案,我还没有意识到,但我期望 - 只要盒子不是黑色的并且在你的脸上是 :-)
【问题讨论】:
-
asyncio 中的“异步”是指一种特定的架构,其中 IO 在内部基于非阻塞调用,但使用协程模拟正常的控制流。 (JavaScript 也是异步的。)“hello world”示例 是 异步的,因为它的“睡眠”从不阻塞任何东西,它只是将控制权交给事件循环,它可以运行数千个这样的循环并行协同程序而不会错过眨眼。从这个意义上说,异步并不意味着“与我的阻塞代码一起在后台运行”;如果你需要,你应该只使用线程。
-
查找
threading模块,尤其是Thread(target=some_function).start(),您可能会以您想要的方式解决您的问题。
标签: python-asyncio