一、共同点

都能进行多任务

二、不同点

  • 协程是轻量级的线程,协程的运行依赖于线程,而线程的运行依赖于协程
  • 共享全局变量问题:
  • 协程: 共享全局变量不需要加锁,不会计算错误。对于全局变量,他的内存地址是不变的,每个协程在修改全局变量的时候,都会访问这个内存地址,因此不论存在多长时间的延时,再返回来计算拿的都是修改后全局变量,因此不会出错。协程之间共享一个进程的内存,但是协程在调度的时候,只有io耗时操作才会切换协程,比如(文件打开,写入,socket连接、接收等),对于普通的耗时操作,协程是无法提供切换的,但是可以通过monkey模块,实现对普通耗时操作,http请求的耗时操作等得切换。
  • 线程: 共享全局变量需要加锁,否则会计算错误。多线程是共享同一个进程的内存。在执行多线程的时候,每个线程的调度时机是随机的,对于全局变量,如果在修改的节点切换线程,在若干时间切换回来后,如果此时其他线程修改了同一个全局变量,那么即使切换回来的,也是用该线程上一次拿到的全局变量进行操作,因为它只是被调度回来继续执行刚才未执行完的流程,因此最后会导致计算错误。举例说明: 两个线程在同时操作一个全局变量g_num,在g_num=0时,t1 取得g_num=0。此时系统把 t1 调度为”sleeping”状态,把t2转换为”running”状态,t2 也获得 g_num=0。然后 t2 对得到的值进行加1并赋给 g_num,使得g_num=1 。接着系统又把 t2 调度为”sleeping”,把 t1 转为”running”。线程t1又把它之前得到的0加1后赋值给g_num。这样导致虽然 t1 和 t2 都对g_num加1,但结果仍然是 g_num=1。