constructor(options, farmOptions = {}) {
    super();
    this.options = {
      maxConcurrentWorkers: WorkerFarm.getNumWorkers(),
      maxConcurrentCallsPerWorker: WorkerFarm.getConcurrentCallsPerWorker(),
      forcedKillTime: 500,
      warmWorkers: true,
      useLocalWorker: true
    };

    if (farmOptions) {
      this.options = Object.assign(this.options, farmOptions);
    }

    this.warmWorkers = 0;
    this.workers = new Map();
    this.callQueue = [];

    if (!this.options.workerPath) {
      throw new Error("Please provide a worker path!");
    }

    this.localWorker = require(this.options.workerPath);
    this.run = this.mkhandle("run");

    this.init(options);
  }
workerPath should always be defined inside farmOptions