gpt4 book ai didi

http - 使用 LuaSocket 的 HTTP 模块下载大文件,同时保持 UI 响应

转载 作者:可可西里 更新时间:2023-11-01 16:21:45 26 4
gpt4 key购买 nike

我想使用 LuaSocket 的 HTTP 模块下载一个大文件,同时在控制台中显示进度,然后在 GUI 中显示。 UI 绝不能阻塞,即使服务器在传输过程中没有响应。此外,创建工作线程来处理下载也不是一种选择。

这是我到目前为止得到的:

local io = io

local ltn12 = require("ltn12")
local http = require("socket.http")

local fileurl = "http://www.example.com/big_file.zip"
local fileout_path = "big_file.zip"

local file_size = 0
local file_down = 0

-- counter filter used in ltn12
function counter(chunk)
if chunk == nil then
return nil
elseif chunk == "" then
return ""
else
file_down = file_down + #chunk
ui_update(file_size, file_down) -- update ui, run main ui loop etc.
return chunk -- return unmodified chunk
end
end

-- first request
-- determine file size
local r, c, h = http.request {
method = "HEAD",
url = fileurl
}
file_size = h["content-length"]

-- second request
-- download file
r, c, h = http.request {
method = "GET",
url = fileurl,
-- set our chain, count first then write to file
sink = ltn12.sink.chain(
counter,
ltn12.sink.file(io.open(fileout_path, "w"))
)
}

上面有一些问题,忽略了错误检查和硬编码:

  1. 它需要 2 个 HTTP 请求,但可能只有 1 个(普通的 GET 请求也发送内容长度)
  2. 如果服务器没有响应,那么 UI 也将没有响应,因为只有在有数据要处理时才会调用过滤器。

我如何确保 UI 永不阻塞?

最佳答案

non-preemptive multithreading in Programming in Lua 上有一个例子它使用非阻塞 luasocket 调用和协程来进行多个并行下载。应该可以将相同的逻辑应用于您的流程以避免阻塞。我只能补充一点,您应该考虑从 GUI 中的 IDLE 事件调用此逻辑(如果有这样的事情)以避免出现“尝试跨元方法/c 调用边界产生”错误。

关于http - 使用 LuaSocket 的 HTTP 模块下载大文件,同时保持 UI 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24386861/

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