gpt4 book ai didi

node.js - 如何在 Node js 中重用 Web 服务器池来执行异步任务

转载 作者:行者123 更新时间:2023-12-04 09:50:21 25 4
gpt4 key购买 nike

我正在使用 async 并行运行超过 7000 个异步任务的队列最大并发数为 18 的队列。

在每个异步任务中,我需要创建一个网络服务器,做一些工作并关闭网络服务器。我正在使用 get-port以获得可用端口,但我仍然会遇到竞争条件,其中两个或多个不同的任务将尝试使用完全相同的端口号。

我的想法是一次性创建这些网络服务器并在任务中重用它们。这样我就不会遇到多个 Web 服务器可以尝试重用同一个端口的问题。

我如何确定我是 不是 在并行异步任务之间重用相同的网络服务器?

这是一些代码,缺少一些不相关的部分:

const asyncTask = async (task) => {
const port = await getPort()
// static files server
const server = http.createServer((request, response) => {
// You pass two more arguments for config and middleware
// More details here: https://github.com/zeit/serve-handler#options
return serveHandler(request, response, {
public: 'dist'
})
})
// start listening
server.listen(port, () => {
console.log(`worker running for task ${task} at port ${port}`)
})

// do the async work

server.close()

return 0
}

const q = queue(asyncTask, 18)
q.drain(function() {
console.log('all items have been processed')
})
q.error(function(err, task) {
console.error(`task ${JSON.stringify(task)} experienced an error`, err)
})
q.push(tasks)

最佳答案

重用您的网络服务器可能有点棘手,因为您必须在每次拿起新任务时找到一种方法来更改回调(以处理异步任务),而无需重新创建新的网络服务器。

仅使用固定的端口队列和 unshift() 怎么样?和 pop()他们在每个任务之后?

const ports = [3001, 3002, ..., 3018];

const asyncTask = async (task) => {

while (ports.length === 0) {
// Wait for a port to become free
}

const port = ports.pop();

// static files server
const server = http.createServer((request, response) => {
// You pass two more arguments for config and middleware
// More details here: https://github.com/zeit/serve-handler#options
return serveHandler(request, response, {
public: 'dist'
})
})

// start listening
server.listen(port, () => {
console.log(`worker running for task ${task} at port ${port}`)
})

// do the async work

server.close()

// Once the work is done, add the port back to the list of ports,
// so that another task can pick it up again. This piece of code should be
ports.unshift(port);

return 0
}

关于node.js - 如何在 Node js 中重用 Web 服务器池来执行异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62023209/

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