Skip to content

Instantly share code, notes, and snippets.

@arleighdickerson
Last active December 1, 2015 23:33
Show Gist options
  • Save arleighdickerson/e042ba2514fceee46e8b to your computer and use it in GitHub Desktop.
Save arleighdickerson/e042ba2514fceee46e8b to your computer and use it in GitHub Desktop.
<?php
namespace console\controllers;
use Yii;
use yii\console\Controller;
use yii\helpers\Json;
use yii\helpers\FileHelper;
class MultithreadingController extends Controller {
public $tempDir;
public $poolSize = null;
public function init() {
parent::init();
$this->tempDir = FileHelper::normalizePath(sys_get_temp_dir());
if ($this->poolSize === null) {
$this->poolSize = $this->getCores() - 1;
}
}
public function getCores() {
return intval(shell_exec("grep -c ^processor /proc/cpuinfo"), 10);
}
protected function writeCommandFile($actions) {
$filename = tempnam($this->tempDir, $this->id);
$handle = fopen($filename, "w");
foreach ($actions as $action) {
list($actionId, $args) = $action;
fwrite($handle, './yii ' . $actionId . " '" . str_replace('"','\"',Json::encode($args)) . "'" . PHP_EOL);
}
fclose($handle);
return $filename;
}
public function runAsync($actions) {
$commands = $this->writeCommandFile($actions);
$maxProcs = $this->poolSize;
system("cat $commands | xargs -I CMD --max-procs=$maxProcs bash -c CMD");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment