Lua - 线程

时间:2015-03-31 13:56:57

标签: multithreading lua coroutine

在下面的代码中,我从设备读取值,为其添加时间戳并通过电子邮件发送字符串。函数“send_email()”需要3分钟,并停止其余代码工作。 所以我的目标是在另一个线程或类似的线程上执行“send_email()”函数,这样收集的数据集之间就不会有3分钟的间隔。因为此时不会收到新数据,但我需要收集所有数据。

It should give out:   value_10:30:00 -> value_10:30:10 -> value_10:30:20...
not:                  value_10:30:00 -> value_10:33:10 -> value_10:36:20...

请注意,以下代码是伪代码。

function main()

    time     = get_time()  --prints the clocktime (format: hour, minutes, seconds)
    mystring = read_value_from_device()
    mystring = mystring .. "_" .. time

    send_email(mystring) --send email (this takes up to 3 minutes!)

    sleep(10)    --sleeps 10 seconds

    main()       --call function again
end

1 个答案:

答案 0 :(得分:1)

存在许多线程库(LuaLanes,lua-llthreads) 我用我的lua-llthreads2 / lua-lzmq

local zthreads = require "lzmq.threads"

-- Create separate OS thread with new Lua state
local thread = zthreads.xactor(function(pipe)
  -----------------------------------------------------
  -- !!! DO NOT USE UPVALUES FROM MAIN LUA STATE !!! --
  -----------------------------------------------------
  while true do
    -- use pipe to get next message
    local msg = pipe:recv()
    if not msg then break end
    print("Thread code:", msg)
  end
end):start()

for i = 1, 10 do
  -- send new message to thread
  thread:send("Message #" .. i)
end

使用此代码,您还可以拥有邮件队列。 但是,如果您生成的消息比发送消息更快,则最终导致应用程序崩溃而没有内存错误。