2020-08-20:GO语言中的协程与Python中的协程的区别?

Python011

2020-08-20:GO语言中的协程与Python中的协程的区别?,第1张

福哥答案2020-08-20:

1.golang的协程是基于gpm机制,是可以多核多线程的。Python的协程是eventloop模型(IO多路复用技术)实现,协程是严格的 1:N 关系,也就是一个线程对应了多个协程。虽然可以实现异步I/O,但是不能有效利用多核(GIL)。

2.golang用go func。python用import asyncio,async/await表达式。

评论

从c

c++转go语言,非常简单。需要了解的也就是语法问题。好在go语法也非常简练,不像python有非常多的语法糖。而且go有自带的资源回收机制,在多线程服务端开发方面,设计简单非常多。同时支持比线程更轻量级的携程,调用也非常简单。不像c语言创建线程进城语言参数复杂的系统调用。

1.携程函数就是让出协程(线程)。当 C 函数调用了 l ua_yieldk, 当前运行的协程会挂起, 启动这个线程的 lu a_resume 调用返回。 参数 nresults 指栈上需返回给 lu a_resume 的返回值的个数。

当协程再次被延续时, L ua 调用延续函数 k 继续运行被挂起()的 C 函数。 延续函数会从前一个函数中接收到相同的栈, 栈中的 n 个返回值被移除而压入了从 lu a_resume 传入的参数。 此外,延续函数还会收到传给 lu a_yieldk 的参数 ctx。

通常,这个函数不会返回; 当协程一次次延续,将从延续函数继续运行。 然而,有一个例外: 当这个函数从一个逐行运行的钩子函数(参见 ) 中调用时,lu a_yieldk 不可以提供延续函数。 (也就是类似 l ua_yield 的形式), 而此时,钩子函数在调用完让出后将立刻返回。 Lu a 会使协程让出,一旦协程再次被延续, 触发钩子的函数会继续正常运行。

2.当一个线程处于未提供延续函数的 C 调用中,调用它会抛出一个错误。 从并非用延续方式(例如:主线程)启动的线程中调用它也会这样

交换同一个状态机下不同线程中的值。

这个函数会从 from 的栈上弹出 n 个值, 然后把它们压入 to 的栈上。

这个函数等价于调用 lua_yieldk, 不同的是不提供延续函数(参见 )。 因此,当线程被延续,线程会继续运行调用 lu a_yield 函数的函数。

3.如果给定索引处的值是一个完全用户数据, 函数返回其内存块的地址。 如果值是一个轻量用户数据, 那么就返回它表示的指针。 否则,返回 NULL 。

把给定索引处的 L ua 值转换为一个 C 字符串。 如果 len 不为 NULL , 它还把字符串长度设到 *len 中。 这个 Lua 值必须是一个字符串或是一个数字; 否则返回返回 NULL 。 如果值是一个数字, l ua_tolstring 还会 把堆栈中的那个值的实际类型转换为一个字符串。 (当遍历一张表5.的时候, 若把 l ua_tolstring 作用在键上, 这个转换有可能导致 l ua_next 弄错。)

lu a_tolstring 返回一个已对齐指针 指向 L ua 状态机中的字符串。 这个字符串总能保证 ( C 要求的)最后一个字符为零 ('\0') , 而且它允许在字符串内包含多个这样的零。

因为 L ua 中可能发生垃圾收集, 所以不保证 lua_tolstring 返回的指针, 在对应的值从堆栈中移除后依然有效。

6.(例如:主线程)启动的线程中调用它也会这样

交换同一个状态机下不同线程中的值。

这个函数会从 from 的栈上弹出 n 个值, 然后把它们压入 to 的栈上。

这个函数等价于调用 lua_yieldk, 不同的是不提供延续函数(参见 )。 因此,当线程被延续,线程会继续运行调用 lu a_yield 函数的函数。