Skip to content

Instantly share code, notes, and snippets.

@hasegawayosuke
Last active February 18, 2022 13:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hasegawayosuke/94e5d764a1e833c25dedbb68c021da58 to your computer and use it in GitHub Desktop.
Save hasegawayosuke/94e5d764a1e833c25dedbb68c021da58 to your computer and use it in GitHub Desktop.
RegExp in worker_threads
// access to http://localhost:3000?n=65536
const http = require('http')
const {URL} = require('url')
const {Worker} = require('worker_threads')
const rex = /\s+$/
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
const main = () => {
const server = http.createServer((req, res) => {
const url = new URL(req.url, 'http://localhost:3000')
if (url.pathname === '/') {
const text = ' '.repeat((url.searchParams.get('n') | 0) + 1) + 'a'
const pattern = rex.source
const worker = new Worker('./worker.js', { workerData: { text, pattern }})
const asyncRexTest = async () => {
return new Promise((resolve, reject) => {
worker.on('message', resolve)
worker.on('error', reject)
worker.on('exit', reject)
})
}
Promise.race([
asyncRexTest(),
sleep(1000)
]).then(result => {
res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'})
if (result === undefined) {
worker.terminate()
res.end('timeout')
} else {
res.end(result.toString())
}
}).catch(error => {
console.error(error)
res.writeHead(500, {'Content-Type': 'text/html;charset=utf-8'})
res.end('Internal Server Error')
})
} else {
res.writeHead(404, {'Content-Type': 'text/html;charset=utf-8'})
res.end('Not Found')
}
})
server.listen(3000)
}
main()
const { workerData, parentPort } = require('worker_threads')
const { text, pattern } = workerData
const re = new RegExp(pattern)
console.log(text.length, pattern, re)
console.time()
parentPort.postMessage(re.test(text))
console.timeEnd()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment