Bagaimana cara menggunakan multi threading dalam aplikasi PHP

Apakah ada cara realistis untuk mengimplementasikan model multi-threaded di PHP apakah benar, atau hanya simulasi saja. Beberapa waktu lalu disarankan agar Anda dapat memaksa sistem operasi untuk memuat instance lain dari PHP yang dapat dieksekusi dan menangani proses simultan lainnya.

Masalahnya adalah ketika kode PHP selesai dieksekusi, instance PHP tetap berada di memori karena tidak ada cara untuk mematikannya dari dalam PHP. Jadi jika Anda mensimulasikan beberapa thread, Anda bisa membayangkan apa yang akan terjadi. Jadi saya masih mencari cara multi-threading dapat dilakukan atau disimulasikan secara efektif dari dalam PHP. Ada ide?


person Steve Obbayi    schedule 16.09.2008    source sumber
comment
Lihat pertanyaan dan jawaban saya di sini: stackoverflow.com/questions/ 2101640/   -  person powtac    schedule 05.05.2012
comment
...dan milik saya di sini: stackoverflow.com/questions /209774/apakah-php-memiliki-threading/   -  person Francois Bourgeois    schedule 08.01.2013
comment
cara menggunakan ekstensi pthreads: phplobby.com/php-multi-thread -konfigurasi-di-windows-pthreads   -  person Emrah Mehmedov    schedule 20.03.2014
comment
Mungkin menarik: pthreads.org   -  person GibboK    schedule 06.01.2016
comment
Sekarang di tahun 2020, sepertinya paralel php.net/manual/en/intro.parallel .php adalah yang kita inginkan daripada pthreads: stackoverflow.com/a/56451969/470749   -  person Ryan    schedule 09.03.2020


Jawaban (16)


Multi-threading dimungkinkan di php

Ya, Anda dapat melakukan multi-threading di PHP dengan pthreads

Dari dokumentasi PHP:

pthreads adalah API berorientasi objek yang menyediakan semua alat yang diperlukan untuk multi-threading di PHP. Aplikasi PHP dapat membuat, membaca, menulis, mengeksekusi dan melakukan sinkronisasi dengan objek Threads, Workers dan Threaded.

Peringatan: Ekstensi pthreads tidak dapat digunakan di lingkungan server web. Oleh karena itu, threading di PHP harus tetap hanya untuk aplikasi berbasis CLI saja.

Tes Sederhana

#!/usr/bin/php
<?php
class AsyncOperation extends Thread {

    public function __construct($arg) {
        $this->arg = $arg;
    }

    public function run() {
        if ($this->arg) {
            $sleep = mt_rand(1, 10);
            printf('%s: %s  -start -sleeps %d' . "\n", date("g:i:sa"), $this->arg, $sleep);
            sleep($sleep);
            printf('%s: %s  -finish' . "\n", date("g:i:sa"), $this->arg);
        }
    }
}

// Create a array
$stack = array();

//Initiate Multiple Thread
foreach ( range("A", "D") as $i ) {
    $stack[] = new AsyncOperation($i);
}

// Start The Threads
foreach ( $stack as $t ) {
    $t->start();
}

?>

Lari pertama

12:00:06pm:     A  -start -sleeps 5
12:00:06pm:     B  -start -sleeps 3
12:00:06pm:     C  -start -sleeps 10
12:00:06pm:     D  -start -sleeps 2
12:00:08pm:     D  -finish
12:00:09pm:     B  -finish
12:00:11pm:     A  -finish
12:00:16pm:     C  -finish

Jalankan Kedua

12:01:36pm:     A  -start -sleeps 6
12:01:36pm:     B  -start -sleeps 1
12:01:36pm:     C  -start -sleeps 2
12:01:36pm:     D  -start -sleeps 1
12:01:37pm:     B  -finish
12:01:37pm:     D  -finish
12:01:38pm:     C  -finish
12:01:42pm:     A  -finish

Contoh Dunia Nyata

error_reporting(E_ALL);
class AsyncWebRequest extends Thread {
    public $url;
    public $data;

    public function __construct($url) {
        $this->url = $url;
    }

    public function run() {
        if (($url = $this->url)) {
            /*
             * If a large amount of data is being requested, you might want to
             * fsockopen and read using usleep in between reads
             */
            $this->data = file_get_contents($url);
        } else
            printf("Thread #%lu was not provided a URL\n", $this->getThreadId());
    }
}

$t = microtime(true);
$g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10));
/* starting synchronization */
if ($g->start()) {
    printf("Request took %f seconds to start ", microtime(true) - $t);
    while ( $g->isRunning() ) {
        echo ".";
        usleep(100);
    }
    if ($g->join()) {
        printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data));
    } else
        printf(" and %f seconds to finish, request failed\n", microtime(true) - $t);
}
person Baba    schedule 19.03.2013
comment
@Baba, saya tidak dapat mengkonfigurasi dan menginstal pthreads di server Xampp. Bisakah Anda membantu saya dengan itu? - person Irfan; 14.09.2013
comment
Unduh biner windows di sini windows.php.net/downloads/pecl/releases /pthreads/0.0.45 - person Baba; 04.10.2013
comment
@Baba bisakah Anda mengakses variabel SESSION bersama dengan multi-thread? - person Mehdi Karamosly; 01.11.2013
comment
@danip - Pekerja MPM untuk Apache tidak ada hubungannya dengan threading userland PHP, itulah yang dibicarakan Baba. Itu adalah dua hal yang sangat berbeda. Pekerja MPM untuk Apache tidak mengekspos fungsionalitas threading apa pun untuk pemrogram PHP, dalam hal memisahkan unit pemrosesan di seluruh thread dan kemudian menggabungkannya () dengan konteks utama setelah selesai. Apa yang dilakukan MPM hanyalah mendistribusikan permintaan dengan cara yang lebih efisien ke proses/utas yang menjalankan proses PHP. - person N.B.; 17.12.2013
comment
Itu bagus, saya sudah bertahun-tahun tidak menyentuh PHP dan sekarang ia memiliki kemampuan multithreading! - person cruizer; 27.03.2014
comment
Bagus dan sederhana! Sekadar info, saya menerapkan aplikasi di server Azure Cloud Win dan jika hanya konfigurasi dasar 1 inti yang dipilih, multi-threading tidak akan tersedia kecuali lebih banyak inti ditambahkan. - person Milan; 27.05.2014
comment
Saya mengalami kesulitan menemukan jawaban atas pertanyaan saya jadi saya akan posting di sini...(PHP tampaknya merupakan bahasa yang sangat emosional dan tingkat retorika subjektif pada subjek... yah... membuat frustrasi, saya ngelantur. ..) Dokumentasi menyebutkan bahwa ini memungkinkan thread pengguna-land. Pertanyaan saya adalah, bagaimana dengan di dalam kernel? Apakah PHP benar-benar multi-thread atau hanya di userland? Dokumentasi mengenai masalah ini juga akan sangat dihargai. - person taylorcressy; 24.09.2014
comment
Silakan lihat di sini stackoverflow.com/questions/28493421/ Saya mencoba menggunakan multithreading tetapi saya tidak yakin ini berfungsi dan membutuhkan waktu lebih lama dari yang diharapkan. - person Raheel; 13.02.2015
comment
@Baba saya menggunakan sistem ubuntu 14.04. cara mengkonfigurasi pthread di dalamnya. - person Abhijit Jagtap; 15.07.2016
comment
Katakanlah Anda memiliki proses php yang memunculkan beberapa thread untuk melakukan beberapa operasi yang mungkin juga melibatkan panggilan ke DB. Sekarang jika ada pengecualian SQL di 1 thread, apakah seluruh sistem akan crash? - person discoverAnkit; 20.10.2016
comment
Mengapa ada penghentian jika tidak menggunakan pthreads untuk web dan hanya digunakan untuk CLI secure.php.net/manual/en/intro.pthreads.php - person Amr ElAdawy; 16.02.2017
comment
@Baba bisakah saya menjalankan thread dengan HTTP? sederhana : namaanda.com/thread.php ? - person My Name; 19.08.2017
comment
Dikatakan membutuhkan 7.2+ tetapi unduhan hanya untuk 7.1.9. Saya menjalankan win32 cli php di 7.1.9, bagaimana saya bisa menggunakan ini? - person Leandro Bardelli; 08.09.2017
comment
Di PHP 7.2.4 (cli) ( ZTS MSVC15 (Visual C++ 2017) x64 ) saya hanya melihat start dan tidak menggemakan finish kenapa?! - person Nabi K.A.Z.; 02.05.2019
comment
Harap berhati-hati: Joe Watkins, penulis ekstensi pthreads menghentikan pengembangan dan mendukung ekstensi paralel baru: github.com/krakjoe/pthreads/issues/929 - person Anton Belonovich; 01.12.2019
comment
pThreads dihentikan. Gunakan parallel dari PHP 7.4. - person T.Todua; 30.05.2021
comment
OTOH, paralel memerlukan versi PHP yang dikompilasi ulang, apakah pemahaman saya? tugas besar yang mengganggu jika Anda sudah memiliki server produksi... ada alternatif lain yang layak? - person Jose Cifuentes; 04.06.2021

kenapa Anda tidak menggunakan popen?

for ($i=0; $i<10; $i++) {
    // open ten processes
    for ($j=0; $j<10; $j++) {
        $pipe[$j] = popen('script2.php', 'w');
    }

    // wait for them to finish
    for ($j=0; $j<10; ++$j) {
        pclose($pipe[$j]);
    }
}
person masterb    schedule 03.12.2010
comment
Saya menggunakan solusi di atas, dan berfungsi dengan baik, menurut saya itu adalah cara paling mudah untuk melakukan proses paralel menggunakan php. - person GodFather; 07.03.2012
comment
seperti yang dikatakan @ e-info128, implementasi ini mem-fork proses, artinya berjalan pada proses yang berbeda, dan tidak berbagi sumber daya proses. Meskipun demikian, jika pekerjaan yang ada tidak memerlukan pembagian sumber daya, maka hal ini akan tetap berhasil dan akan berjalan secara paralel. - person Raffi; 10.01.2017
comment
Bagaimana Anda meneruskan variabel ke popen tanpa menggunakan variabel sesi? - person atwellpub; 13.03.2017
comment
@atwellpub Tidak mungkin, ini adalah proses terpisah yang tidak berbagi sumber daya. Bahkan sesi akan menjadi mekanisme IPC yang canggung - person Cholthi Paul Ttiopic; 23.10.2017
comment
@e-info128 apa itu garpu? - person MAZux; 14.10.2018
comment
Untuk meneruskan data kepada mereka, Anda juga dapat menggunakan argumen dan server Redis. - person Amir Fo; 06.03.2019
comment
@MAZux Garpu biasanya merupakan proses anak yang dihasilkan oleh induknya. Jadi di sini disarankan agar aplikasi PHP single threaded dapat membuat proses PHP lain (fork) dan menggunakannya seperti pendekatan threading palsu - person Greg Hilston; 03.05.2019
comment
Saya memiliki skrip cron yang berjalan setiap menit. Daftar tugas telah berkembang cukup besar sehingga memerlukan lebih dari satu menit setiap kali dijalankan. Ini akan menjadi sempurna untuk membagi tugas tanpa menambahkan lebih banyak skrip cron secara manual. Terima kasih. - person user2924019; 01.09.2020
comment
Saya mencoba kode ini, tetapi saya mendapatkan kesalahan sh: 1: script2.php: not found. File tersebut memang ada. Saya juga mencoba path lengkap ke file tersebut, kesalahan yang sama. Adakah ide tentang apa yang salah? - person Wyatt Jackson; 22.06.2021

Threading tidak tersedia dalam stok PHP, tetapi pemrograman bersamaan dimungkinkan dengan menggunakan permintaan HTTP sebagai panggilan asinkron.

Dengan pengaturan batas waktu curl disetel ke 1 dan menggunakan session_id yang sama untuk proses yang ingin Anda kaitkan satu sama lain, Anda dapat berkomunikasi dengan variabel sesi seperti pada contoh saya di bawah ini. Dengan metode ini Anda bahkan dapat menutup browser Anda dan proses bersamaan masih ada di server.

Jangan lupa untuk memverifikasi ID sesi yang benar seperti ini:

http://localhost/test/verifysession.php?sessionid=[the id yang benar ]

proses mulai.php

$request = "http://localhost/test/process1.php?sessionid=".$_REQUEST["PHPSESSID"];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_exec($ch);
curl_close($ch);
echo $_REQUEST["PHPSESSID"];

proses1.php

set_time_limit(0);

if ($_REQUEST["sessionid"])
   session_id($_REQUEST["sessionid"]);

function checkclose()
{
   global $_SESSION;
   if ($_SESSION["closesession"])
   {
       unset($_SESSION["closesession"]);
       die();
   }
}

while(!$close)
{
   session_start();
   $_SESSION["test"] = rand();
   checkclose();
   session_write_close();
   sleep(5);
}

verifikasisesi.php

if ($_REQUEST["sessionid"])
    session_id($_REQUEST["sessionid"]);

session_start();
var_dump($_SESSION);

closeprocess.php

if ($_REQUEST["sessionid"])
    session_id($_REQUEST["sessionid"]);

session_start();
$_SESSION["closesession"] = true;
var_dump($_SESSION);
person Community    schedule 03.07.2009
comment
Terakhir kali saya memeriksa (beberapa tahun yang lalu) php tidak mengizinkan untuk mengakses penyimpanan sesi berbasis file dengan dua proses secara bersamaan. Ini mengunci file dan proses kedua harus menunggu di sana menunggu skrip pertama berhenti. Saya sedang berbicara tentang lingkungan server web, bukan CLI. - person Alexei Tenitski; 06.05.2011
comment
set_time_limit(0); ya! Jangan pernah melakukan ini. - person Kafoso; 27.05.2016
comment
@Kafoso Kafoso kenapa tidak? Saya setuju untuk PHP sebagai pemroses skrip web, tapi mengapa tidak di CLI? Jika terjadi kesalahan, CLI dapat dimatikan dengan Ctrl+C... - person sijanec; 01.09.2019
comment
Saya juga akan menggunakan set_time_limit(0); untuk pendengar soket yang berjalan tanpa batas.. - person Jay Dadhania; 18.09.2020
comment
set_time_limit menyegarkan batas waktu, jadi mungkin masuk akal untuk memasukkannya ke dalam perulangan while dengan batas waktu yang cukup, misalnya 30 detik di sini. - person TechNyquist; 30.12.2020

Meskipun Anda tidak dapat melakukan thread, Anda memiliki tingkat kontrol proses tertentu di php. Dua kumpulan fungsi yang berguna di sini adalah:

Fungsi kontrol proses http://www.php.net/manual/en/ref.pcntl.php

Fungsi POSIX http://www.php.net/manual/en/ref.posix.php

Anda dapat membagi proses Anda dengan pcntl_fork - mengembalikan PID anak tersebut. Kemudian Anda dapat menggunakan posix_kill untuk menghapus PID itu.

Artinya, jika Anda mematikan proses induk, sinyal harus dikirim ke proses anak yang memerintahkannya untuk mati. Jika php sendiri tidak mengenalinya, Anda dapat mendaftarkan fungsi untuk mengelolanya dan melakukan exit bersih menggunakan pcntl_signal.

person J.D. Fitz.Gerald    schedule 16.09.2008
comment
Jawaban itu sekarang sudah sangat ketinggalan jaman (yang sangat adil karena mengetahui bahwa jawabannya sudah berumur 11 tahun). Lihatlah pthreads di bawah ini. - person Maciej Paprocki; 10.07.2019
comment
@MaciejPaprocki pThread sekarang dihentikan dari PHP 7.4 sebagai gantinya gunakan paralel - person Airy; 31.03.2020

penggunaan thread dimungkinkan oleh ekstensi PECL pthreads

http://www.php.net/manual/en/book.pthreads.php

person pinkal vansia    schedule 31.10.2013
comment
pThread sekarang dihentikan dari php 7.4 sebagai gantinya gunakan paralel. - person T.Todua; 30.05.2021

Saya tahu ini adalah pertanyaan lama tetapi bagi orang yang mencari, ada ekstensi PECL yang ditulis dalam C yang memberikan kemampuan multi-threading PHP sekarang, terletak di sini https://github.com/krakjoe/pthreads

person JasonDavis    schedule 19.09.2012
comment
pThread sekarang dihentikan dari php 7.4 sebagai gantinya gunakan paralel - person Airy; 31.03.2020

Anda dapat menggunakan exec() untuk menjalankan skrip baris perintah (seperti baris perintah php), dan jika Anda menyalurkan output ke file maka skrip Anda tidak akan menunggu hingga perintah selesai.

Saya tidak begitu ingat sintaks php CLI, tetapi Anda menginginkan sesuatu seperti:

exec("/path/to/php -f '/path/to/file.php' | '/path/to/output.txt'");

Saya pikir beberapa server hosting bersama telah menonaktifkan exec() secara default karena alasan keamanan, tetapi mungkin patut dicoba.

person Adam Hopkinson    schedule 16.09.2008

Anda bisa mensimulasikan threading. PHP dapat menjalankan proses latar belakang melalui popen (atau proc_open). Proses-proses tersebut dapat dikomunikasikan melalui stdin dan stdout. Tentu saja proses-proses itu sendiri bisa menjadi program php. Itu mungkin sedekat yang Anda dapatkan.

person Pete    schedule 26.08.2010

Anda dapat memiliki pilihan:

  1. multi_ikal
  2. Seseorang dapat menggunakan perintah sistem untuk hal yang sama
  3. Skenario yang ideal adalah, membuat fungsi threading dalam bahasa C dan mengkompilasi/mengkonfigurasi dalam PHP. Sekarang fungsi itu akan menjadi fungsi PHP.
person Manoj Donga    schedule 10.05.2011

Bagaimana dengan pcntl_fork?

periksa halaman manual kami untuk contoh: PHP pcntl_fork

<?php

    $pid = pcntl_fork();
    if ($pid == -1) {
        die('could not fork');
    } else if ($pid) {
        // we are the parent
        pcntl_wait($status); //Protect against Zombie children
    } else {
        // we are the child
    }

?>
person Jarrod    schedule 13.01.2012

Bergantung pada apa yang Anda coba lakukan, Anda juga bisa menggunakan curl_multi untuk mencapainya.

person Sheldmandu    schedule 25.01.2011

Jika Anda menggunakan server Linux, Anda dapat menggunakan

exec("nohup $php_path path/script.php > /dev/null 2>/dev/null &")

Jika Anda perlu menyampaikan beberapa argumen

exec("nohup $php_path path/script.php $args > /dev/null 2>/dev/null &")

Di skrip.php

$args = $argv[1];

Atau gunakan Symfony https://symfony.com/doc/current/components/process.html

$process = Process::fromShellCommandline("php ".base_path('script.php'));
$process->setTimeout(0);     
$process->disableOutput();     
$process->start();
person Юрий Ярвинен    schedule 29.04.2020

pcntl_fork tidak akan berfungsi di lingkungan server web jika mode aman diaktifkan. Dalam hal ini, ini hanya akan berfungsi di PHP versi CLI.

person Stilero    schedule 02.02.2012

Mungkin saya melewatkan sesuatu tetapi exec tidak berfungsi secara asinkron untuk saya di lingkungan windows saya menggunakan yang berikut di windows dan itu berfungsi dengan baik;)

$script_exec = "c:/php/php.exe c:/path/my_ascyn_script.php";

pclose(popen("start /B ". $script_exec, "r"));
person Mubashar    schedule 03.10.2013
comment
Untuk meretas multithreading di PHP Anda harus membuka beberapa pernyataan popen() (PHP tidak akan menunggu sampai selesai). Kemudian setelah setengah lusin atau lebih terbuka, Anda memanggil pclose() (PHP akan menunggu pclose() selesai). Dalam kode Anda, Anda menutup setiap utas segera setelah membukanya sehingga kode Anda tidak berperilaku seperti multithread. - person Kmeixner; 19.06.2014

Saat komentar saya saat ini ditulis, saya tidak tahu tentang thread PHP. Saya sendiri datang untuk mencari jawabannya di sini, tetapi salah satu solusinya adalah program PHP yang menerima permintaan dari server web mendelegasikan seluruh formulasi jawaban ke aplikasi konsol yang menyimpan outputnya, jawaban atas permintaan, ke file biner dan program PHP yang meluncurkan aplikasi konsol mengembalikan file biner byte demi byte sebagai jawaban atas permintaan yang diterima. Aplikasi konsol dapat ditulis dalam bahasa pemrograman apa pun yang berjalan di server, termasuk bahasa yang memiliki dukungan threading yang tepat, termasuk program C++ yang menggunakan OpenMP.

Salah satu trik yang tidak dapat diandalkan dan kotor adalah dengan menggunakan PHP untuk menjalankan aplikasi konsol, "uname",

uname -a

dan cetak output dari perintah konsol tersebut ke output HTML untuk mengetahui versi pasti dari perangkat lunak server. Kemudian instal versi perangkat lunak yang sama persis ke instance VirtualBox, kompilasi/rakit biner apa pun yang sepenuhnya mandiri, sebaiknya statis, yang diinginkan, lalu unggah ke server. Sejak saat itu, aplikasi PHP dapat menggunakan biner tersebut sebagai aplikasi konsol yang memiliki multi-threading yang tepat. Ini adalah solusi yang kotor dan tidak dapat diandalkan untuk situasi ketika administrator server belum menginstal semua implementasi bahasa pemrograman yang diperlukan ke server. Hal yang harus diwaspadai adalah setiap permintaan yang diterima aplikasi PHP, aplikasi konsol akan dihentikan/keluar/get_killed.

Mengenai apa yang dipikirkan oleh administrator layanan hosting tentang pola penggunaan server seperti itu, saya kira itu bermuara pada budaya. Di Eropa Utara, penyedia layanan HARUS MEMBERIKAN APA YANG DIIKLANKAN dan jika eksekusi perintah konsol diizinkan dan pengunggahan file non-malware diizinkan dan penyedia layanan berhak mematikan proses server apa pun setelah beberapa menit atau bahkan setelah 30 detik , maka administrator layanan hosting tidak memiliki argumen untuk mengajukan keluhan yang tepat. Di Amerika Serikat dan Eropa Barat situasinya/budayanya sangat berbeda dan saya yakin ada kemungkinan besar bahwa di AS dan/atau Eropa Barat penyedia layanan hosting akan menolak melayani klien layanan hosting yang menggunakan trik yang dijelaskan di atas. Itu hanya tebakan saya, mengingat pengalaman pribadi saya dengan layanan hosting AS dan berdasarkan apa yang saya dengar dari orang lain tentang layanan hosting Eropa Barat. Saat komentar saya saat ini ditulis (2018_09_01), saya tidak tahu apa pun tentang norma budaya penyedia layanan hosting Eropa Selatan, administrator jaringan Eropa Selatan.

person Martin Vahi    schedule 01.09.2018

Multithreading berarti melakukan banyak tugas atau proses secara bersamaan, kita dapat mencapainya di php dengan menggunakan kode berikut, meskipun tidak ada cara langsung untuk mencapai multithreading di php tetapi kita dapat mencapai hasil yang hampir sama dengan cara berikut.

chdir(dirname(__FILE__));  //if you want to run this file as cron job
 for ($i = 0; $i < 2; $i += 1){
 exec("php test_1.php $i > test.txt &");
 //this will execute test_1.php and will leave this process executing in the background and will go         

 //to next iteration of the loop immediately without waiting the completion of the script in the   

 //test_1.php , $i  is passed as argument .

}

Tes_1.php

$conn=mysql_connect($host,$user,$pass);
$db=mysql_select_db($db);
$i = $argv[1];  //this is the argument passed from index.php file
for($j = 0;$j<5000; $j ++)
{
mysql_query("insert  into  test   set

                id='$i',

                comment='test',

                datetime=NOW() ");

}

Ini akan mengeksekusi test_1.php dua kali secara bersamaan dan kedua proses akan berjalan di latar belakang secara bersamaan, jadi dengan cara ini Anda bisa mencapai multithreading di php.

Orang ini melakukan pekerjaan yang sangat bagus Membuat multithread di php

person Pir Abdul    schedule 05.11.2013
comment
Selain itu, ini tidak ada hubungannya dengan MultiThreading. Ini adalah pemrosesan paralel. Hal yang sangat berbeda. - person Digital Human; 11.12.2017
comment
Menurut pendapat saya sebagai solusi, peretasan darurat, ide di balik solusi yang ditawarkan sangat tepat, tapi saya kira orang yang berbeda dapat melakukan perang api tentang apa yang dimaksud dengan multi-threading yang sebenarnya, karena ada perbedaan antara konkurensi dan pemrosesan paralel berbasis perangkat keras , seperti dijelaskan di: youtube.com/watch?v=cN_DpYBzKso - person Martin Vahi; 01.09.2018