2023-01-27 21:23:53.851
2023-01-27 21:23:53.852 Pure PHP multiTask implementation
2023-01-27 21:23:53.852 Proof of concept
2023-01-27 21:23:53.852
2023-01-27 21:23:53.852 It's not impossible. It's easy.
2023-01-27 21:23:53.852
2023-01-27 21:23:53.852 Start 10000 iterations
2023-01-27 21:23:53.852
2023-01-27 21:23:54.018 Average time:
2023-01-27 21:23:54.018 Task: 'task_empty' Time = 0.83 μs
2023-01-27 21:23:54.018 Task: 'task_init' Time = 2.55 μs
2023-01-27 21:23:54.018 Task: 'task_init_and_start_new_task' Time = 6.16 μs
2023-01-27 21:23:54.018 Task: 'task_init_and_complete_task' Time = 4.6 μs
2023-01-27 21:23:54.018 Total time of 4 tasks = 15.63 μs
2023-01-27 21:23:54.018
2023-01-27 21:23:54.018 Total test time 0.16639 sec
2023-01-27 21:23:54.153 Total test time (Without time counting) 0.134806 sec
2023-01-27 21:23:54.153
2023-01-27 21:23:54.153 Costs of time (including time counting costs):
2023-01-27 21:23:54.153 Call task function 0.83 μs
2023-01-27 21:23:54.153 Prepare task environment 1.72 μs
2023-01-27 21:23:54.153 Start new task 3.61 μs
2023-01-27 21:23:54.153 End task 2.05 μs
2023-01-27 21:23:54.153
2023-01-27 21:23:54.153 1 μs = 1/1000000 = 0.000001 sec.
2023-01-27 21:23:54.153 One task can start other task rtask("task_name"); or call other task rcall("task_name"); Where "task_name" is a name of PHP function written using special rules. Thus the applying of these rules to any user-defined function makes the function as task Т.е. любая пользовательская функция может быть превращена в задачу и выполняться параллельно другим таким же задачам. При этом время переключения между задачами составляет 13-20 μs в зависимости от реализации. Фактически это накладные расходы на подготовку окружения задачи. В среднем нормально написанная задача занимает около 50 μs на вызов. Т.е. за 1 секунду можно обслужить примерно 20000 вызовов задач. Таким образом при наличии 10 задач каждая будет вызываться примерно раз в 500 μs или 2000 раз в секунду. По сути это время реакции системы. В данном примере среднее время вызова задачи составляет 3.91 μs и для 4х задач время реакции примерно 15.63 μs Реализован данный функционал на чистом PHP, не требует каких либо расширений и работает с любой версией PHP. Ну во всяком случае должен :) Current PHP version: 5.6.40
2023-01-27 21:23:54.153 Пример реальной работы
2023-01-27 21:23:54.153 Стартуем от 3 до 7 задач ожидания со случайным временем от 0.1 до 1.5 сек. единственная функция каждой задачи это ждать заданный интервал времени и выводить информацию о своем старте и завершении. $n=mt_rand(3,7); for( $i=0; $i < $n; $i+=1) { $time=mt_rand(100,1500)/1000.0; rtask("wait",$time); }
2023-01-27 21:23:54.153 start task 20003 wait 0.715 sec
2023-01-27 21:23:54.153 start task 20004 wait 0.537 sec
2023-01-27 21:23:54.153 start task 20005 wait 0.923 sec
2023-01-27 21:23:54.691 task 20004 complete
2023-01-27 21:23:54.868 task 20003 complete
2023-01-27 21:23:55.076 task 20005 complete
2023-01-27 21:23:55.077 Done.