Nim 计算多个线程
Nim counting over multiple threads
我目前正在计算我请求网站的次数。在 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 in Action”一书第 174 页中的副本。
首先,如果您在 Python 中使用全局变量,则必须使用锁或冒竞争条件的风险。在 Nim 中情况没有什么不同:首先创建一个全局变量,然后使用 lock.
来保护它
import locks
var counterLock: Lock
initLock(counterLock)
var counter {.guard: counterLock.} = 0
现在在需要更新计数器的地方使用 withLock
:
withLock counterLock:
counter.inc
书里paralellism/concurrency相关的章节写的很好。您应该检查它,因为它还解释了并发性(您的代码是并发性优于线程的示例)或如何使用 Channels 在线程之间传递数据,例如。
我目前正在计算我请求网站的次数。在 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 in Action”一书第 174 页中的副本。
首先,如果您在 Python 中使用全局变量,则必须使用锁或冒竞争条件的风险。在 Nim 中情况没有什么不同:首先创建一个全局变量,然后使用 lock.
来保护它import locks
var counterLock: Lock
initLock(counterLock)
var counter {.guard: counterLock.} = 0
现在在需要更新计数器的地方使用 withLock
:
withLock counterLock:
counter.inc
书里paralellism/concurrency相关的章节写的很好。您应该检查它,因为它还解释了并发性(您的代码是并发性优于线程的示例)或如何使用 Channels 在线程之间传递数据,例如。