你好,试图理解qt中异步的本质...他们说qt是异步编程。假设这是代码:
void requests() {
websocket->sendTextMessage(text1);
websocket->sendTextMessage(text2);
}
我们发送一个请求,一个响应来了,它被排队,然后我们发送第二个请求,它的答案也排队等待第一个响应,然后在 onTextMessageReceived 槽中我们一个一个地处理响应......尽管事实第二条消息可能会更早收到响应,因此会更早地处理它。我不明白为什么这是一种异步方法?没有任何并行处理,我们仅在退出 requests() 函数时才进入 onTextMessageReceived() 槽,即 事实上,在 requests() 函数结束后同步...
您将异步与并行性混淆了。这是两个根本不同的概念。
异步是一种在我们不知道请求和响应之间的时间(或非常大)的情况下不浪费时间等待的方法,并且可以在这个暂停中执行一些其他操作,并延迟处理响应直到这些动作结束,如果响应会更早到来。在这种情况下,动作不是并行执行的,而是顺序执行的,但序列本身不是由程序决定的,而是由外部延迟决定的。
如果您同步查询,则顺序为:
在您的示例中,在第一个请求和处理对它的响应之间,您的程序发出第二个请求,并可能处理对第二个请求的响应。
这种方法(异步)很方便,因为它可以在任何计算设备上执行,不像并行,它需要处理器和操作系统的支持。
此外,准备真正并行执行的资源消耗可能高于异步执行的损失。
PS 事件驱动方式是实现异步的方式之一,在我看来是最简单易懂的。
没有异步编程这样的东西。执行可以是异步的。如果我们谈论
Qt
,那么说“面向事件的编程”会更正确。其实质就是槽对信号的处理。你想要异步数据套接字处理吗?所以给这些套接字这样一个机会 - 将它们从执行的主线程中取出,创建一个线程池,每个线程将有一个套接字。在这种情况下,每个插座都会有独立的并行信号处理。换句话说,这就是所需的异步性。