Setiap kali metode mulai dari kelas Thread dipanggil, kode metode run dapat dieksekusi dalam utas terpisah secara paralel
Sinopsis kelas
Thread extends Threaded implements Countable , Traversable , ArrayAccess { /* Methods */ public void detach [ void ] public integer getCreatorId [ void ] public static Thread getCurrentThread [ void ] public static integer getCurrentThreadId [ void ] public integer getThreadId [ void ] public static mixed globally [ void ] public boolean isJoined [ void ] public boolean isStarted [ void ] public boolean join [ void ] public void kill [ void ] public boolean start [[ integer $options ] ] /* Inherited methods */ public array Threaded::chunk [ integer $size , boolean $preserve ] public integer Threaded::count [ void ] public bool Threaded::extend [ string $class ] public Threaded Threaded::from [ Closure $run [, Closure $construct [, array $args ]] ] public array Threaded::getTerminationInfo [ void ] public boolean Threaded::isRunning [ void ] public boolean Threaded::isTerminated [ void ] public boolean Threaded::isWaiting [ void ] public boolean Threaded::lock [ void ] public boolean Threaded::merge [ mixed $from [, bool $overwrite ] ] public boolean Threaded::notify [ void ] public boolean Threaded::notifyOne [ void ] public boolean Threaded::pop [ void ] public void Threaded::run [ void ] public mixed Threaded::shift [ void ] public mixed Threaded::synchronized [ Closure $block [, mixed $.. ] ] public boolean Threaded::unlock [ void ] public boolean Threaded::wait [[ integer $timeout ] ] }
php_fungsi_referensi. htm
Saat Anda mulai dengan multi-threading di PHP, Anda mungkin mulai dengan membuat kelas Thread dan membuat instance untuk setiap tugas yang perlu Anda lakukan. Tidak apa-apa jika Anda hanya memiliki beberapa tugas, tetapi Anda dapat dengan cepat membebani server Anda jika Anda memiliki banyak tugas. Juga, bahkan jika Anda menjadwalkan utas sehingga tidak semuanya berjalan sekaligus, sangat tidak efisien untuk membuat utas per tugas karena ada overhead dalam membuat dan menghancurkan utas. Jauh lebih efisien untuk menggunakan kembali utas berulang kali untuk menyelesaikan pekerjaan ini. Di sinilah "kumpulan" masuk dan di mana seseorang perlu memisahkan "pekerjaan" [atau pekerjaan/tugas] dari "pekerja" [utas]
Di bawah ini adalah skrip yang mendefinisikan kelas tugas [MyTask
] yang dibuat beberapa kali dengan. Setiap kali tugas diberikan daftar angka untuk melakukan perhitungan [$inputs
]. Kami kemudian memberi contoh kumpulan utas dan menyerahkan daftar tugas untuk dikerjakan. Kumpulan utas akan bekerja sampai semua pekerjaan selesai, dengan setiap utas di kumpulan mengerjakan satu pekerjaan pada satu waktu. Ketika semua tugas telah selesai, kami mendapatkan semua hasilnya dengan menanyakan hasilnya kepada objek tugas. Kami tidak mencoba mendapatkan kembali data dengan pergi ke kumpulan atau utas
m_inputs = $inputs;
$this->m_outputs = new Threaded[]; // we will store the results in here.
}
public function run[]
{
foreach [$this->m_inputs as $input]
{
// casting the array to an array is not a mistake
// but actually super important for this to work
// //github.com/krakjoe/pthreads/issues/813#issuecomment-361955116
$this->m_outputs[] = [array]array[
'property1' => $input * 2,
'property2' => [$input + 2],
];
}
}
# Accessors
public function getResults[] { return $this->m_outputs; }
}
function main[]
{
$inputs = range[0,10000];
$numInputsPerTask = 20;
$inputGroups = array_chunk[$inputs, $numInputsPerTask];
$numCpus = 4; // I would nomrally dynamically fetch this and sometimes large [e.g. aws C5 instances]
$numTasks = count[$inputGroups];
$numThreads = min[$numTasks, $numCpus]; // don't need to spawn more threads than tasks.
$pool = new Pool[$numThreads];
$tasks = array[]; // collection to hold all the tasks to get the results from afterwards.
foreach [$inputGroups as $inputsForTask]
{
$task = new MyTask[$inputsForTask];
$tasks[] = $task;
$pool->submit[$task];
}
while [$pool->collect[]];
# We could submit more stuff here, the Pool is still waiting for work to be submitted.
$pool->shutdown[];
# All tasks should have been completed at this point. Get the results!
$results = array[];
foreach [$tasks as $task]
{
$results[] = $task->getResults[];
}
print "results: " . print_r[$results, true];
}
main[];
_Mendapatkan Jawaban Keluar
Ketika saya pertama kali mulai bekerja dengan utas, saya merasa cukup mudah untuk membuatnya dan membuatnya menampilkan pesan, tetapi saya bingung bagaimana cara mengambil hasil dengan utas utama ketika pekerjaan telah selesai. Ini karena tidak terpikir oleh saya bahwa "pekerjaan" menyimpan informasi tentang parameter pekerjaan dan hasilnya, bukan utasnya. Utas hanya menjalankan pekerjaan, tanpa petunjuk tentang cara kerjanya. Anda dapat menganggap utas sebagai monyet terlatih yang telah diajari memutar engkol, dan pekerjaannya adalah wadah dengan engkol di bagian luar yang dapat diakses monyet. Monyet tidak tahu apa yang terjadi di dalam wadah ketika dia memutar engkol, tetapi semua wadah menyelesaikan pekerjaannya dan mendapatkan hasilnya di dalam. Salah satu wadah mungkin telah mengupas kentang saat engkol diputar, sedangkan yang lain mungkin adalah generator manual yang mengisi baterai