gpt4 book ai didi

multithreading - 异步方法和线程之间有什么区别?

转载 作者:行者123 更新时间:2023-12-04 08:26:23 25 4
gpt4 key购买 nike

有人可以解释一下异步方法和在Vala中创建线程之间的区别吗?在我的代码中应该使用哪一个?

最佳答案

async方法在主线程中运行时,线程是可独立调度的,也就是说,它们是协程。例如,如果您阻止在单独的线程中读取套接字,则应用程序可以继续运行,但是如果您通过async方法执行此操作,则应用程序将阻止。

线程和协程(async方法)可以解决一些相同的问题,但是通常做不同的事情。在Gtk +(和许多其他GUI系统)中,只有一个线程可以操纵GUI对象,而来自GUI对象的事件将仅在该线程中发生(通常称为事件分配线程)。如果另一个线程想要访问GUI项,则它要么需要a)经过一些锁定过程,要么b)向EDT发送消息。这适用于所有线程间通信:要在线程之间进行通信或使用共享资源,需要进行锁定和通信。

协程在EDT中作为“只是另一个事件”执行。考虑一下您有一个带有下载按钮的窗口的情况。当用户单击按钮时,EDT将启动与按钮关联的单击处理程序。如果该代码实际上是试图下载文件,则GUI将卡住,直到文件下载完成。如果启动了协程,则按钮的处理程序将启动async方法,该方法将打开套接字,然后被告知尚未准备好。然后它将套接字和回调放入EDT的循环(GLib.MainLoop)。按钮的处理程序将完成,EDT将坐下来等待X显示器或套接字上的事件,然后调用正确的回调来处理它。这允许GUI事件与套接字事件以交错的方式进行处理。但是,一次只能有一个处理程序,因此处理程序需要能够快速完成,否则应用程序将无响应。

使用协程会导致大量的回调,但是async方法隐藏了回调,因此即使不是,它看起来也像直线代码。

如果您的任务主要是在等待,那么协程是正确的选择。如果您的任务忙于工作,那么毫无疑问它将需要进入一个线程。 Courotine不能超过一个CPU的工作量,而线程可以在多个CPU上并行运行。 GLib的协程也不容易与线程混合:试图让async方法在两个线程中独立运行并非理智:只有EDT才能使用async方法。

关于multithreading - 异步方法和线程之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com