【问题标题】:Nim counting over multiple threadsNim 计算多个线程
【发布时间】:2021-02-21 12:41:37
【问题描述】:

我目前正在尝试计算我请求网站的次数。在 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()

【问题讨论】:

    标签: nim-lang


    【解决方案1】:

    这几乎被解释为“Nim in Action”一书第 174 页的副本。

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

    import locks
    
    var counterLock: Lock
    initLock(counterLock)
    var counter {.guard: counterLock.} = 0
    

    现在在需要更新计数器的地方使用withLock

    withLock counterLock:
      counter.inc
    

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

    【讨论】:

    • 谢谢,工作得很好。顺便提一句。我认为你有一个错字,它的“导入锁”不是“导入锁”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2015-06-19
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多