【问题标题】:Can a python async http transfer by easily added to an existing code base?可以轻松地将 python 异步 http 传输添加到现有代码库吗?
【发布时间】: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


【解决方案1】:

谢谢! @user4815162342 - 完全成功了!!

import _thread, time, socket

def YoBlably(stuff):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("example.com", 80))
    sent=s.send(b'GET /my_path/check_update.asp?u=u1.20200505&v=1.20200503&a=_aft&p=my_prog HTTP/1.1\x0d\x0aHost: example.com\x0d\x0aAccept-Encoding: identity\x0d\x0aUser-Agent: Python\x0d\x0aConnection: close\x0d\x0a\x0d\x0a')
    if sent==0:
        print("s Problem")

    chunk = s.recv(1024000)
    if chunk == b'':
        print("r Problem")

    print('got {}.'.format(chunk))
    s.close()



print("Starting in 1s...");
time.sleep(1)
_thread.start_new_thread(YoBlably, ('foo',))
print("Started...");
for i in range(0,6):
    time.sleep(1)
    print('{}...'.format(i))

print("The end...");

输出:-

$ python  pythreadsock.py 
Starting in 1s...
Started...
got b'HTTP/1.1 200 OK\r\nDate: Wed, 20 May 2020 01:47:28 GMT\r\nServer: Apache/2.0.52\r\nExpires: Sun, 17 May 2020 23:58:28 GMT\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nContent-Length: 35\r\nConnection: close\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{"current_version_xyz":1.20200502}\n'.
0...
1...
2...
3...
4...
5...
The end...

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 2010-10-27
    • 2023-04-06
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多