lua同步调用C异步函数

沉睡的女人

c用以下代码调用lua

if ( lua_pcallk(L, 0, LUA_MULTRET, 0, ctx, pcallk_continue) != 0 ) 
{}

lua代码是

local coroutine = coroutine
co = coroutine.create( function (...) 
c.call(...)
    -- [run here]
end )

c.call() 是一个异步C函数(在函数末尾调用lua_yieldk(),利用网络接收数据并调用lua_resume())

return lua_yieldk(L, 0, 0, yield_continue);

它可以运行yield_continue,但不能运行到,这是"[run here]"为什么?

参考网址:http : //www.lua.org/manual/5.2/manual.html#4.7

情绪

这是调度员的主要思想。

工作线程启动异步操作并切换到调度程序线程。分派器线程轮询异步操作,并在完成操作时切换到辅助线程。

-- basic async operation queue
local ASYNC_RECV = {}

-- Put operation to queue and wait
local function recv()
  local co = coroutine.running()

  -- here we start async operation
  ASYNC_RECV[co] = true
  -- here we switch to dispatcher
  return coroutine.yield()
end

coroutine.wrap(function()
  for i = 1, 10 do print(recv()) end
end)()


-- main Loop
-- here we poll all async operation and 
-- resume according coroutines

while true do
  -- we have no async operation
  if not next(ASYNC_RECV) then break end

  for co in pairs(ASYNC_RECV) do
    ASYNC_RECV[co] = nil -- mark operation is done
    coroutine.resume(co, "some string") -- send result to coroutine
  end
end

这是使用libuv作为调度程序的工作示例

local uv = require "lluv"

local function sleep(timeout)
  local co = coroutine.running()

  -- here we start async operation
  uv.timer():start(timeout, function(timer)
    timer:close() -- just close unused timer.

    -- dispatcher(libuv) call this callback and
    -- callback switch to coroutine
    coroutine.resume(co)
  end)

  coroutine.yield()
end

coroutine.wrap(function()
  for i = 1, 10 do
    print("Tick")
    sleep(1000)
  end
end)()

uv.run()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

lua同步调用C异步函数

来自分类Dev

同步调用异步方法

来自分类Dev

异步调用的同步循环

来自分类Dev

异步调用同步方法

来自分类Dev

如何从 C# 中的同步调用异步方法?

来自分类Dev

同步异步发出的异步调用

来自分类Dev

C#套接字:异步调用中的同步调用

来自分类Dev

异步调用模板函数

来自分类Dev

同步功能内的异步调用

来自分类Dev

Scala将异步调用与Future同步

来自分类Dev

如何同步调用异步(等待)方法?

来自分类Dev

在内进行异步调用以同步

来自分类Dev

使科特林异步调用同步

来自分类Dev

同步调用异步方法时出错

来自分类Dev

如何同步调用异步(等待)方法?

来自分类Dev

在内进行异步调用以同步

来自分类Dev

同步CasperJS操作期间的异步调用

来自分类Dev

异步进程上的同步调用

来自分类Dev

同步调用异步函数时被调用者的线程会发生什么

来自分类Dev

如何在不阻塞主线程的情况下同步调用异步函数?

来自分类Dev

如何在元素数组上同步调用异步函数?

来自分类Dev

节点JS异步映射是同步或异步调用

来自分类Dev

AngularJS从指令设置函数的同步调用

来自分类Dev

调用异步方法时,StreamWriter使用同步调用

来自分类Dev

还需要同步调用支持时的C#异步

来自分类Dev

如何异步调用AWS Lambda函数

来自分类Dev

Knockout计算函数内部的异步调用

来自分类Dev

在OCaml中异步调用函数

来自分类Dev

异步调用的函数语法