热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于skynet的lua协程挂超时唤醒

场景描述:A程序有A1,A2两个操作需要执行B程序有B1,B2两个操作需要执行表面逻辑:A程序需要获取B程序的数据(B不能直接回复A消息,需要通过另一个通道通知)细节逻辑:A程序需

场景描述:
A程序有A1,A2两个操作需要执行
B程序有B1,B2两个操作需要执行

表面逻辑:A程序需要获取B程序的数据(B不能直接回复A消息,需要通过另一个通道通知)
细节逻辑:A程序需要执行A1后,发送消息给B1,B1执行消息后使用B2消息回复A程序,发送给A2,A2去唤醒A1,A程序A1就得到了数据。A2的作用是接收数据,处理数据。

带有日志的代码如下,成功执行step1,2,3,4,5表示程序正常

local skynet = require "skynet"
local skynetmgr = require "skynet.manager"
local json = require 'json'
local httpc = require "http.httpc"
local COnFIG= require "config"
local queue = require "skynet.queue"
local coroutine = require "skynet.coroutine"

CMD = {}
ussoperation = {}

local function wake_up_regularly(dataid)
    -- 等待30秒
    skynet.sleep(3000)
    
    if ussoperation[tostring(dataid)].func ~= "" then
        print("===================4======================",os.date('%Y-%m-%d %H:%M:%S', os.time()),dataid,"Timeout awaken")
        local func = ussoperation[tostring(dataid)].func 
        ussoperation[tostring(dataid)].func = ''
        skynet.wakeup(func)
    else
        print("===================任务已结束======================",os.date('%Y-%m-%d %H:%M:%S', os.time()),dataid)
    end
    
    return
end

-- 获取函数A1函数
local function get_data(dataid)
    print("===================1======================",os.date('%Y-%m-%d %H:%M:%S', os.time()),dataid)
    ussoperation[tostring(dataid)] = {}
    ussoperation[tostring(dataid)].func = coroutine.running()
    -- 超时唤醒
    print("===================2======================",os.date('%Y-%m-%d %H:%M:%S', os.time()),dataid)
    skynet.fork(wake_up_regularly,dataid)
    -- 挂起,等待采集到数据后唤醒
    print("===================3======================",os.date('%Y-%m-%d %H:%M:%S', os.time()),dataid)
    skynet.wait()
    print("===================5======================",os.date('%Y-%m-%d %H:%M:%S', os.time()),dataid)
    ussoperation[tostring(dataid)].func = ''
    return {code=0,msg="success"}
end

-- 新建获取数据的任务
function CMD.TEMPPIC(para)
    if ussoperation[tostring(para.id)].func ~= "" then
        local func = ussoperation[tostring(para.id)].func 
        ussoperation[tostring(para.id)].func = ''
        skynet.wakeup(func)
        print("===================4======================",os.date('%Y-%m-%d %H:%M:%S', os.time()),para.id,"Normal wake up")
    else
        return {code=-1,msg="fail"}
    end
    print("===============TEMPPIC END========================")
    return {code=0,msg="success"}
end

-- 接收数据A2函数
function CMD.TEMPPICCMD(para)
    print(json.encode(para))
    skynet.fork(get_data,para.id)
    return {code=0,msg="success"}
end

function initialise()
    skynet.fork(get_data,456789)
end

skynet.start(function()
    skynet.dispatch("lua", function(session, address, cmd, ...)
        cmd = cmd:upper()
        local f = CMD[cmd]
        if f then
            skynet.ret(skynet.pack(f(...)))
        else
            local msg = string.format("Unknown command %s", tostring(cmd))
            skynet.retpack({{errno=-1, badresult=true, err=msg, sqlstate=0}})
        end
    end)

    initialise()

    skynet.register(".mywake")
end)

有两个任务一个是789任务,另一个是456789任务
基于skynet 的lua协程挂超时唤醒


推荐阅读
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 当使用 `new` 表达式(即通过 `new` 动态创建对象)时,会发生两件事:首先,内存被分配用于存储新对象;其次,该对象的构造函数被调用以初始化对象。为了确保资源管理的一致性和避免内存泄漏,建议在使用 `new` 和 `delete` 时保持形式一致。例如,如果使用 `new[]` 分配数组,则应使用 `delete[]` 来释放内存;同样,如果使用 `new` 分配单个对象,则应使用 `delete` 来释放内存。这种一致性有助于防止常见的编程错误,提高代码的健壮性和可维护性。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在Java基础中,私有静态内部类是一种常见的设计模式,主要用于防止外部类的直接调用或实例化。这种内部类仅服务于其所属的外部类,确保了代码的封装性和安全性。通过分析JDK源码,我们可以发现许多常用类中都包含了私有静态内部类,这些内部类虽然功能强大,但其复杂性往往让人感到困惑。本文将深入探讨私有静态内部类的作用、实现方式及其在实际开发中的应用,帮助读者更好地理解和使用这一重要的编程技巧。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 本文以 www.域名.com 为例,详细介绍如何为每个注册用户提供独立的二级域名,如 abc.域名.com。实现这一功能的核心步骤包括:首先,确保域名支持泛解析,即将 A 记录设置为 *.域名.com,以便将所有二级域名请求指向同一服务器。接着,在服务器端使用 ASP.NET 2.0 进行配置,通过解析 HTTP 请求中的主机头信息,动态识别并处理不同的二级域名,从而实现个性化内容展示。此外,还需在数据库中维护用户与二级域名的对应关系,确保每个用户的二级域名都能正确映射到其专属内容。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有