Nim 对多个线程进行计数

arc*_*erk 2 nim-lang

我目前正在尝试计算我请求网站的次数。在 python 中,我只会使用一个全局变量,但我不知道如何在 nim 中编写它。

import httpclient

proc threadMain(a: int) {.thread.} =

    var client = newHttpClient()
    while true:
      try:
        var r = client.getContent("URL")
        echo "sent"
        #Count here
      except:
        echo "error"

var thread: array[0..10, Thread[int]]

for i in 0..10:
  thread[i].createThread(threadMain, i)

thread.joinThreads()
Run Code Online (Sandbox Code Playgroud)

xbe*_*llo 5

这几乎在《 Nim in Action 》一书中第 174 页中得到了解释。

首先,如果您在 Python 中使用全局变量,则必须使用锁,否则会面临竞争条件的风险。Nim 中的情况并没有什么不同:首先创建一个全局变量,并使用来保护它。

import locks

var counterLock: Lock
initLock(counterLock)
var counter {.guard: counterLock.} = 0
Run Code Online (Sandbox Code Playgroud)

现在使用withLock需要更新计数器的位置:

withLock counterLock:
  counter.inc
Run Code Online (Sandbox Code Playgroud)

书中与并行/并发相关的章节非常好。您应该检查它,因为它还解释了并发性(您的代码是并发性优于线程的示例)或如何使用Channels在线程之间传递数据等。