小编Hus*_*ser的帖子

在 Javascript 中以 50 个小块执行 100K Promise

我有一个函数可以对服务进行 REST 调用并返回一个承诺。让我们调用该函数 Execute()。该函数采用 ID 并将 ID 作为 GET 参数发送到 REST 端点,该端点将 ID 与一些附加信息一起保存在 mongoDB 数据库中。

在客户端中,我需要从 ID(0 到 100k)运行“执行”100k 次,并显示每个 ID 的状态(成功还是失败)。

我做了显而易见的事情,我创建了一个从 0 到 100k 的循环并运行执行传递“i。这导致我的 Chrome 最终冻结内存不足(资源不足)。它还导致后面所有其余调用的网络拥塞结尾。

所以我想把这 100k 切成可管理的数量,就像每个 50 个 Promise 调用一样。当这 50 个都完成时(无论失败还是成功),我想使用Promise.all([])。然后执行下一个 50,直到所有 100k 完成。这样我就可以同时控制网络拥塞和内存。但我似乎不知道如何摆脱这种情况。这是我的代码。

let promises = []
for (let i = 0; i < 100000, i++)
    {
       promises.push(execute(i))
       if (i % 50 === 0) 
       {
          Promise.all(promises)
          .then  (a => updateStatus (a, true))
          .catch (a => updateStatus (a, false)) 

       } …
Run Code Online (Sandbox Code Playgroud)

javascript rest promise

8
推荐指数
1
解决办法
1万
查看次数

使用数据库备份postgres Container

所以我们有大约100个测试,每个测试连接到postgres实例并使用加载了一些数据的数据库.测试编辑并更改数据,以便我们为每个测试重新加载postgres数据库.

这需要很长时间,所以我想到如下使用Docker.我是docker的新手,所以这就是我正在使用的步骤:

1)我将创建一个postgres容器,使用我想要的测试数据库加载它并使其准备好和抛光.

2)使用此命令将我的容器保存为tar

 docker save -o postgres_testdatabase.tar postgres_testdatabase
Run Code Online (Sandbox Code Playgroud)

3)对于每个测试,我将新焦油加载到图像中

  docker load -i postgres_testdatabase.tar
Run Code Online (Sandbox Code Playgroud)

4)使用postgres实例运行容器

docker run -i -p 5432 postgres_testdatabase
Run Code Online (Sandbox Code Playgroud)

5)测试运行并更改数据..

6)销毁容器并使用新的测试数据库加载新容器

7)运行第二次测试,依此类推.

我的问题是,我发现当我将容器备份到tar并加载它然后运行一个新容器我没有得到我的数据库时,我基本上得到了一个没有我的数据库的新鲜postgres安装.

我做错了什么?

编辑:

在我将容器保存到图像之前,我尝试了其中一个建议来提交我的更改,如下所示:

我将更新的容器提交到新图像.将Image保存到tar文件,删除了我现有的容器.加载tar文件,然后从我保存的图像中运行一个新容器.我仍然没有看到我的数据库..我相信它必须对Volumes做些什么.如果没有卷,我该怎么做?如何强制所有数据都在容器中,以便备份图像?

EDIT2 Warmoverflow建议我在加载图像时使用sql文件加载我的所有数据.这不适用于我的情况,因为数据是使用其他软件(ArcGIS)精心编写的,加上数据有一些复杂的blob字段几何,因此加载脚本的sql文件无法正常工作.他还建议我不需要将数据保存为tar,如果我在同一台机器上运送容器.一旦我对我的数据感到满意并将其提交给图像,我就可以将图像加载到新容器中.谢谢你澄清这一点.问题仍然是如何将我的数据库保留在我的图像中,因此当我恢复图像时,数据库随容器一起提供.

EDIT3

所以我找到了一个灵感来自hotoverflow建议的解决方法,这应该可以解决我的问题.但是,我仍然在寻找一种更清洁的方法来做到这一点.

解决方案是执行以下操作:

  • 创建一个新鲜的postgres容器.
  • 根据需要填充数据库,在我的情况下,我使用ArcGIS来执行此操作
  • 使用pg_dumpall使用此命令将整个postgres实例转储到单个文件中.我们可以从任何postgres客户端运行此命令,我们不必将转储文件复制到容器中.我是从Windows运行的.

    C:\ Program Files\PostgreSQL\9.3\bin> pg_dumpall.exe -h 192.168.99.100 -p 5432 -U postgres> c:\ Hussein\dump\pg_test_dump.dmp

  • 您现在可以安全地删除容器.

  • 创建一个新的postgres容器
  • 在容器postgres实例上调用此命令以加载转储

    C:\ Program Files\PostgreSQL\9.3\bin> psql -fc:\ Hussein\dump\pg_test_dump.dmp -h 192.168.99.100 -p 5432 -U postgres

  • 运行测试,测试将拧紧数据,因此我们需要重新加载,我们只需重复上述步骤.

我仍然,真的希望容器图像将数据库"放在其中"所以当我从图像运行容器时,我得到了数据库.如果有人能提出解决方案,那将会很棒,这将为我节省大量时间.

Edit4最后,Warmoverflow解决了它!答案如下

谢谢

docker

2
推荐指数
1
解决办法
1365
查看次数

标签 统计

docker ×1

javascript ×1

promise ×1

rest ×1