我安装了新的xampp(7.0.2 atm)。我已经创建了php-cli.ini,在那里添加了pthread扩展并将内存限制设置为3 GB。但当我试图启动线程脚本时,我得到了这个:
PHP Fatal error: Uncaught RuntimeException: cannot start my_thread, out of reso
urces in C:\xampp\htdocs\w\start_threads.php:160
Stack trace:
#0 C:\xampp\htdocs\w\start_threads.php(160): Thread->start()
#1 {main}
thrown in C:\xampp\htdocs\w\start_threads.php on line 160
Fatal error: Uncaught RuntimeException: cannot start my_thread, out of resources
in C:\xampp\htdocs\w\start_threads.php:160
(我使用的是pthreds 3.1.5 x86) 我在这做错了什么?谢谢!
答案 0 :(得分:2)
本质上,这是由pthread_create
返回EAGAIN
引起的:这意味着系统缺少创建另一个线程的资源,或者系统对最大线程数施加限制(在进程中,或已达到系统范围。
这可能是由两件事造成的,因为一些软件的设计方式,有目的地使用更多的线程而不是一个进程可以同时处理,或者由于线程加入不够优雅而导致更有害。 / p>
如果你有时似乎只遇到这样的错误,那么就会暗示后者正在发生;确保清理(显式连接)您完成的线程以使行为可预测。
答案 1 :(得分:-1)
我的PHP版本:7.2.6 x82 和pthreads:php_pthreads-3.1.6-7.2-ts-vc15-x86 我创建了25个线程,当创建第21个线程然后发生相同的错误。 我认为它只能创建20个线程。 所以我编辑了我的代码并且没有发生错误 我的代码:
class ReadAllFile extends Thread {
public $folder;
public function __construct($folder) {
$this->folder = $folder;
}
public function run() {
//code process
}
}
$dir = "F:/sbd/sbdstore/20180606/";
$subFolders = scandir ( $dir );
$stack = array();
foreach ( $subFolders as $folder ) {
if ($folder != '.' && $folder != '..') {
$stack[] = new ReadAllFile ( $dir.$folder );
}
}
$maxNumberOfThread = 20;
$numberOfRunning = 0;
$numberOfStack = count($stack);
$elementIsStarted = array();
$allElementIsProcess = false;
while(count($stack)){
if($numberOfRunning <= $maxNumberOfThread && !$allElementIsProcess){
for($i=0;$i<$numberOfStack;$i++){
if(!in_array($i,$elementIsStarted)){
$numberOfRunning++;
$elementIsStarted[] = $i;
$stack[$i]->start();
if($i == $numberOfStack - 1){
$allElementIsProcess = true;
}
$i = $numberOfStack + 1;
}
}
}else{
foreach($elementIsStarted AS $element){
if(isset($stack[$element]) && $stack[$element]->isRunning() !== true){
unset($stack[$element]);
$numberOfRunning--;
}
}
}
}
希望这有帮助。 抱歉我的英文。
P / s:如果我使用PHP版本:7.2.6 x64和php_pthreads-3.1.6-7.2-ts-vc15-x64那么它不会发生此错误。 我认为x64配置的内存更多。