Cancel Regex match if timeout

后端 未结 1 822
感情败类
感情败类 2020-12-11 04:29

Is it possible to cancel a regex.match operation if takes more than 10 seconds to complete?

I\'m using an huge regex to match a specific text, and somet

相关标签:
1条回答
  • 2020-12-11 05:13

    You could spawn a child process that does the regex matching and kill it off if it hasn't completed in 10 seconds. Might be a bit overkill, but it should work.

    fork is probably what you should use, if you go down this road.

    If you'll forgive my non-pure functions, this code would demonstrate the gist of how you could communicate back and forth between the forked child process and your main process:

    index.js

    const { fork } = require('child_process');
    const processPath = __dirname + '/regex-process.js';
    const regexProcess = fork(processPath);
    let received = null;
    
    regexProcess.on('message', function(data) {
      console.log('received message from child:', data);
      clearTimeout(timeout);
      received = data;
      regexProcess.kill(); // or however you want to end it. just as an example.
      // you have access to the regex data here.
      // send to a callback, or resolve a promise with the value,
      // so the original calling code can access it as well.
    });
    
    const timeoutInMs = 10000;
    let timeout = setTimeout(() => {
      if (!received) {
        console.error('regexProcess is still running!');
        regexProcess.kill(); // or however you want to shut it down.
      }
    }, timeoutInMs);
    
    regexProcess.send('message to match against');
    

    regex-process.js

    function respond(data) {
      process.send(data);
    }
    
    function handleMessage(data) {
      console.log('handing message:', data);
      // run your regex calculations in here
      // then respond with the data when it's done.
    
      // the following is just to emulate
      // a synchronous computational delay
      for (let i = 0; i < 500000000; i++) {
        // spin!
      }
      respond('return regex process data in here');
    }
    
    process.on('message', handleMessage);
    

    This might just end up masking the real problem, though. You may want to consider reworking your regex like other posters have suggested.

    0 讨论(0)
提交回复
热议问题