diff --git a/Node/workerpi.js b/Node/workerpi.js
new file mode 100644
index 0000000000000000000000000000000000000000..d7ae629eb91d065880135c1a83902f3d7832a8b3
--- /dev/null
+++ b/Node/workerpi.js
@@ -0,0 +1,46 @@
+//
+// workerpi.js
+// Neil Gershenfeld 12/11/18
+// pi calculation benchmark
+// pi = 3.14159265358979323846
+//
+const {Worker} = require('worker_threads')
+var points = 1e9
+var thread =
+   `
+   const Worker = require('worker_threads')
+   Worker.parentPort.on('message',(msg) => {
+      var index = msg.index
+      var points = msg.points
+      var a = 0.5
+      var b = 0.75
+      var c = 0.25
+      var sum = 0
+      var start = 1+points*index
+      var end = points*(index+1)
+      for (var i = start; i <= end; ++i)
+         sum += a/((i-b)*(i-c))
+      Worker.parentPort.postMessage(sum)
+   })
+   `
+var workers = parseInt(process.argv[2])
+var results = 0
+var pi = 0
+var tstart = Date.now()/1000
+for (let i = 0; i < workers; ++i) {
+   var worker = new Worker(thread,{eval:true})
+   worker.on('message',(sum) => {
+      results += 1
+      pi += sum
+      if (results == workers) {
+         var tend = Date.now()/1000
+         var mflops = (workers*points)*5.0*1e-6/(tend-tstart)
+         console.log('pi: '+pi)
+         console.log('time: '+(tend-tstart).toFixed(1)+'s')
+         console.log('workers: '+workers)
+         console.log('estimated MFlops: '+mflops.toFixed(1))
+         process.exit()
+         }
+      })
+   worker.postMessage({index:i,points:points})
+   }