一、具体流程:
每次有个请求,处理线程把请求的消息放在 全局队列global queue里面,每次线程pop一个次级queue的消息出来,再用协程去处理具体的消息(等待协程处理完回调,等次级queue 的消息处理完再返回 global queue 再给原来调用这个服务的请求)如图示
【skynet】消息传递过程
二、代码分析:
1、消息传递:

  • global queue 包含(次级queue)
  • skynet.send(插入次级queue) 【协程处理消息】
  • skynet_context_push(mq取出次级queue,插入消息)
  • global queue 的 push 操作 +了自旋锁【多线程】

2、创建thread:skynet_start.c的start
每个worker都有一个weight值,pop出n条消息(受weight值影响):一次性消费多少条次级queue的消息
线程安全:避免服务重复调用,如何是连续两个相同的服务请求?
1)这个次级消息队列要从全局消息队列里取
2)虽然一个服务的callback函数,只能在一个thread内被调用,但是在多个thread中,可以向同一个次级消息队列push消息,即便是该次级消息队列所对应的服务正在执行callback函数

相关文章:

  • 2021-09-16
  • 2022-01-14
  • 2021-10-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-15
猜你喜欢
  • 2021-05-08
  • 2021-08-26
  • 2021-06-12
  • 2021-09-01
  • 2022-01-03
  • 2021-11-21
  • 2021-06-02
相关资源
相似解决方案