@@ -25,51 +25,33 @@ proc fib(x: int): int =
25
25
else: fib(x-1) + fib(x-2)
26
26
27
27
proc workerMain(proxy: ThreadProxy) {.thread.} =
28
- echo proxy.name, " is running"
29
-
30
28
# register action handler
31
29
proxy.onData "fib":
32
30
let x = data.getInt()
33
- echo proxy.name, " is finding fib(", x, ")"
34
- let y = fib(x)
35
- result = %*{
36
- "name": proxy.name,
37
- "input": x,
38
- "output": y
39
- }
31
+ return %fib(x)
40
32
41
33
# start processing channel
42
- asyncCheck proxy.poll()
43
-
44
- # do other async task here
45
-
46
- runForever()
34
+ waitFor proxy.poll()
47
35
48
36
proc main() =
49
37
let proxy = newMainThreadProxy("master")
50
38
asyncCheck proxy.poll()
51
39
52
40
# create N threads
53
41
let N = 4
54
- for i in 0..<N:
42
+ for i in 0 ..< N:
55
43
proxy.createThread("worker_" & $i, workerMain)
56
44
57
- # distribute M jobs to threads randomly
45
+ # distribute M jobs to threads
58
46
let M = 40
59
47
var done = 0
60
48
for x in 1..M:
61
49
capture x:
62
- let future = proxy.ask("worker_" & $(x mod N), "fib", %x)
50
+ let name = "worker_" & $(x mod N)
51
+ let future = proxy.ask(name, "fib", %x)
63
52
future.addCallback:
64
- if future.failed:
65
- let err = future.readError()
66
- echo err.msg
67
- else:
68
- let json = future.read
69
- let name = json["name"].getStr()
70
- let x = json["input"].getInt()
71
- let y = json["output"].getInt()
72
- echo name, " found fib(", x, ") = ", y
53
+ let y = future.read
54
+ echo name, ": fib(", x, ") = ", y
73
55
done += 1
74
56
75
57
while done < M: poll()
0 commit comments