gpt4 book ai didi

lua - 如何处理没有 coroutine.yield() 的 Lua 库?

转载 作者:行者123 更新时间:2023-12-04 18:11:27 25 4
gpt4 key购买 nike

我想下载一个大文件并同时处理其他事情。

但是, luasocket.http 从不打电话coroutine.yield() .文件下载时,其他所有内容都会卡住。

这是一个说明性示例,我尝试同时下载文件并打印一些数字:

local http = require'socket.http'

local downloadRoutine = coroutine.create(function ()
print 'Downloading large file'
-- Download an example file
local url = 'http://ipv4.download.thinkbroadband.com/5MB.zip'
local result, status = http.request(url)
print('FINISHED download ('..status..', '..#result..'bytes)')
end)

local printRoutine = coroutine.create(function ()
-- Print some numbers
for i=1,10 do
print(i)
coroutine.yield()
end
print 'FINISHED printing numbers'
end)

repeat
local printActive = coroutine.resume(printRoutine)
local downloadActive = coroutine.resume(downloadRoutine)
until not downloadActive and not printActive
print 'Both done!'

运行它会产生这个:
1
Downloading large file
FINISHED download (200, 5242880bytes)
2
3
4
5
6
7
8
9
10
FINISHED printing numbers
Both done!

如您所见, printRoutineresume d 首先。它打印数字 1 和 yield s。 downloadRoutine然后是 resume d,下载整个文件,不让步。只有这样才能打印其余的数字。

我不想编写自己的套接字库!我能做些什么?

编辑(当天晚些时候) : 部分MUSH用户 have also noticed .他们提供有用的想法。

最佳答案

我不明白你为什么不能使用 PiL advicecopas library (这与给出的答案几乎相同 here )。

Copas 包装了套接字接口(interface)(不是 socket.http ),但您可以使用低级接口(interface)来获得您需要的东西(未经测试):

require("socket")
local conn = socket.tcp()
conn:connect("ipv4.download.thinkbroadband.com", 80)
conn:send("GET /5MB.zip HTTP/1.1\n\n")
local file, err = conn:receive()
print(err or file)
conn:close()

然后您可以使用 addthread从 copas 给你一个非阻塞套接字并使用 step/loop要做的功能 receive虽然有东西要接收。

使用 copas 的工作量更少,而使用 settimeout(0)直接为您提供更多控制权。

关于lua - 如何处理没有 coroutine.yield() 的 Lua 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com