在用pthreads修补/测试了几天之后,我设法从头开始编写了一个真正满足我需要的脚本。我的脚本的重点是像 500-1000 个线程一样运行异步,并在有可用线程时立即创建新线程。但是,因为我不是PHP 专家,所以我的代码可能有一些缺陷,或者它可能是我想要的相同任务,但以另一种方式,以更好的方式。
到目前为止,我看到的一些缺陷是:
- 该脚本可能会导致 CPU 进入 100% 使用状态,因为如果在 while 循环中没有使用睡眠。参见 sleep(3) 行。
- 代码中存在缺陷或不必要的东西。因为我是 pthreads 的菜鸟,所以它可能是做同样事情的另一种方式,但更优化'。
感谢任何改进我的代码的建议。我发布这个的原因是因为我实际上没有在搜索引擎上找到任何这样做的东西。所有的例子都是同步的,所有的异步例子,比如,运行 500 个线程然后停止,我一直在寻找它可以产生 500 个线程但继续产生另外 500 个线程直到到达文件末尾的东西。
脚本:
<?php
// Maximum number of threads.
$max_threads = 15; // I do plan to use like 500-1000 threads.
// Initiate the threads.
$threads = [];
for($i = 0; $i <= $max_threads; $i++) {
$threads[$i] = new MultiThreads($i);
$threads[$i]->start();
}
// Keep creating threads. Here I plan to make it to read a large file of urls(targets) but for demo/testing purpose I made a while loop.
while(true) {
for($i = 0; $i <= $max_threads; $i++) {
if($threads[$i]->isRunning() != true) { // If is not true(which means thread is busy) keep creating new threads. Why not creating a thread if is available.
$threads[$i] = new MultiThreads($i);
$threads[$i]->start();
}
}
//echo 'Sleeping for a while untill some threads are free.' . "\n"; // Or comment sleep(3) to not wait at all.
//sleep(3);
}
// End of script.
echo 'END! But will never end cause of while loop.' . "\n";
//////////////////////////////////////////////////////////////////
class MultiThreads extends Thread {
private $threadId;
public function __construct(int $id) {
$this->threadId = $id;
}
public function run() {
echo 'Thread(' . $this->threadId . ') started.' . "\n";
sleep(rand(1, 10)); // Simulate some 'work'.
echo 'Thread(' . $this->threadId . ') ended.' . "\n";
}
}
?>