小编ken*_*tor的帖子

在cronjob的输出日志中添加新行

现在我将我的php脚本的输出附加到日志文件.不幸的是,它将所有内容写入一行.如何更改我的cron命令以将每个执行日志附加到新行?

我目前的cronjob看起来像这样:

/usr/local/bin/php -q /home/username/public_html/forum/cron.php >> /home/username/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)

cron cpanel

3
推荐指数
2
解决办法
2646
查看次数

从Array中获取三个最低值

假设我有一个像这样的JSON对象:

{"27":[2300,2300,2700,2300,2300,2300,2500,2300,2700,2300,2300,2300,2700,2300,2700,2300,2300,2300,2300,1900,2700,2300,2300,2300]}
Run Code Online (Sandbox Code Playgroud)

我想从这个数组中获取三个最低值并将其存储为另一个数组.我已经尝试sort()但经验丰富,它认为10000低于1300例如.

问题:如何从上面的JSON对象中获取三个最低值并将其存储为自己的数组?

这就是我尝试对数组进行排序的方法:

-prices[searchLog.PriceSearchId].sort();
Run Code Online (Sandbox Code Playgroud)

javascript json node.js

3
推荐指数
1
解决办法
85
查看次数

在MongoDB游标上迭代很慢

我需要遍历约200万个文档的完整MongoDb集合。因此,我正在使用光标eachAsync功能。但是我注意到它非常慢(需要40多分钟)。我尝试了多达5000个不同的batchSizes(针对MongoDB的查询仅为400个)。

该应用程序不会占用太多CPU(0.2%-1%),也不会占用大量RAM或IOP。因此,显然可以优化我的代码以加快此过程。

代码:

  const playerProfileCursor = PlayerProfile.find({}, { tag: 1 }).cursor({ batchSize: 5000 })
  const p2 = new Promise<Array<string>>((resolve, reject) => {
    const playerTags:Array<string> = []
    playerProfileCursor.eachAsync((playerProfile) => {
      playerTags.push(playerProfile.tag)
    }).then(() => {
      resolve(playerTags)
    }).catch((err) => {
      reject(err)
    })
  })
Run Code Online (Sandbox Code Playgroud)

当我在eachAsync函数体内设置断点时,它将立即命中。因此,没有任何卡住,它是如此之慢。有没有办法加快速度?

javascript mongoose mongodb node.js

3
推荐指数
1
解决办法
776
查看次数

Mongoose eachAsync with async function = 内存泄漏?

我不确定这是猫鼬的错误还是我做错了什么。一旦我在游标上迭代时开始使用异步函数,eachAsync我就会遇到内存泄漏(快速上升到 4GB 然后崩溃)。在尝试了一些事情之后,我注意到如果我不使用异步函数作为回调就不会发生这种情况。

无内存泄漏:

const playerCursor: QueryCursor<IPlayerProfileModel> = PlayerProfile.find({}, projection).lean().cursor();
    await playerCursor.eachAsync(
      (profile: IPlayerProfileModel) => {
        return;
      },
      { parallel: 50 }
    );
Run Code Online (Sandbox Code Playgroud)

内存泄漏:

const playerCursor: QueryCursor<IPlayerProfileModel> = PlayerProfile.find({}, projection).lean().cursor();
    await playerCursor.eachAsync(
      async (profile: IPlayerProfileModel) => {
        return;
      },
      { parallel: 50 }
    );
Run Code Online (Sandbox Code Playgroud)

显然上面的代码没有任何意义,但我需要在函数内执行异步操作。

题:

是什么导致内存泄漏/如何避免它?

mongoose node.js

3
推荐指数
1
解决办法
1367
查看次数

使用异步初始化代码进行 Mocha 测试

我正在为 REST 客户端库编写测试,该库必须使用 OAuth 交换“登录”服务。为了防止登录我要测试的每个端点,我想编写某种“测试设置”,但我不确定应该如何执行此操作。

我的测试项目结构:

  • 测试
    • 端点类别1.spec.ts
    • 端点category2.spec.ts

如果我只有一个“端点类别”,我会有这样的事情:

describe('Endpoint category 1', () => {
  let api: Client = null;

  before(() => {
    api = new Client(credentials);
  });

  it('should successfully login using the test credentials', async () => {
    await api.login();
  });

  it('should return xyz\'s profile', async () => {
    const r: Lookup = await api.lookup('xyz');
    expect(r).to.be.an('object');
  });
});
Run Code Online (Sandbox Code Playgroud)

我的问题:

由于 login() 方法是那里的第一个测试,它可以工作并且客户端实例也可用于所有以下测试。但是,如何进行某种设置,使“登录的 api 实例”可用于我的其他测试文件?

unit-testing mocha.js node.js typescript

3
推荐指数
1
解决办法
2640
查看次数

根据布尔参数使用条件返回类型

我正在编写一个库,并希望提供更准确的类型,以便库用户在下面的示例中不能选择错误的类型。

此方法或者返回IPlayerStats或者IStatsItem[]如果该参数convertJSONOutput设置为true。

public async getStatsById(
    userId: string,
    timeWindow: TimeWindow = TimeWindow.Alltime,
    convertJSONOutput: boolean = true
  ): Promise<IPlayerStats | IStatsItem[]> {
  // Ommitted
}
Run Code Online (Sandbox Code Playgroud)

问题:

我可以指定一个条件返回类型来指示将返回哪个接口(取决于convertJSONOutput布尔参数)吗?

typescript

3
推荐指数
1
解决办法
235
查看次数

默认节点选择器

使用案例

假设我有 3 个不同的节点池:defaultkafkateam-a。我想确保只有与 kafka 相关的部署以及 daemonsets 或 kubernetes 系统服务之类的东西在此节点池上运行。为此,我只需将节点选择器添加到我的 kafka 部署中,以便它只能在 kafka 节点池上进行调度:

nodeSelector:
  cloud.google.com/gke-nodepool: kafka
Run Code Online (Sandbox Code Playgroud)

问题

当我有进一步的部署或有状态集没有指定任何节点选择器时,它们可能会被安排在该 kafka 节点池上。相反,我希望将没有节点选择器的所有其他部署安排在我的默认节点池内。

措辞为通用问题

如何确保没有节点选择器的所有部署和有状态集都将安排在特定节点池内?

kubernetes google-kubernetes-engine

3
推荐指数
1
解决办法
2669
查看次数

不同端口上的重复抓取目标

我使用的抓取配置与示例中建议的配置非常相似。由于某种原因,我有重复的抓取目标。我想知道为什么会这样

我的抓取配置:

  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_scrape ]
        action: keep
        regex: true
      - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_path ]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [ __address__, __meta_kubernetes_pod_annotation_prometheus_io_port ]
        action: replace
        regex: (.+):(?:\d+);(\d+)
        replacement: ${1}:${2}
        target_label: __address__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - action: labeldrop
        regex: statefulset_kubernetes_io_pod_name # This is duplicate because we already have the pod_name
      - source_labels: [ __meta_kubernetes_namespace ]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [ __meta_kubernetes_pod_name ]
        action: replace …
Run Code Online (Sandbox Code Playgroud)

prometheus

3
推荐指数
1
解决办法
2875
查看次数

无需预编译 Go 代码即可将 protobuf 序列化消息转换为 JSON

我想将 protobuf 序列化消息转换为人类可读的 JSON 格式。我面临的主要问题是我需要在不事先将 proto 描述符编译为 Go 代码的情况下执行此操作。我可以.proto在运行时访问文件,但不能在编译时访问。

我的印象是新的 Protobuf API v2 ( https://github.com/protocolbuffers/protobuf-go ) 支持动态反序列化(请参阅包types/dynamicpb),但我显然无法弄清楚如何使用它:

func readDynamically(in []byte) {
    // How do I load the required descriptor (for NewMessage()) from my `addressbook.proto` file?)
    descriptor := ??

    msg := dynamicpb.NewMessage(descriptor)
    err := protojson.Unmarshal(in, msg)
    if err != nil {
        panic(err)
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码注释了我的问题:如何dynamicpb.NewMessage().proto文件中获取所需的描述符?

go protocol-buffers

3
推荐指数
1
解决办法
538
查看次数

将多个 go 例程的响应获取到一个数组中

我需要从多个 go 例程中获取响应并将它们放入一个数组中。我知道可以为此使用通道,但是我不确定如何确保所有 go 例程都完成了对结果的处理。因此我使用了一个等待组。

代码

func main() {
  log.Info("Collecting ints")
  var results []int32
  for _, broker := range e.BrokersByBrokerID {
      wg.Add(1)
      go getInt32(&wg)
  }
  wg.Wait()
  log.info("Collected")
}

func getInt32(wg *sync.WaitGroup) (int32, error) {
  defer wg.Done()

  // Just to show that this method may just return an error and no int32
  err := broker.Open(config)
  if err != nil && err != sarama.ErrAlreadyConnected {
    return 0, fmt.Errorf("Cannot connect to broker '%v': %s", broker.ID(), err)
  }
  defer broker.Close()

  return 1003, nil
} …
Run Code Online (Sandbox Code Playgroud)

concurrency go goroutine

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