Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если говорить про реквест-респонсе, то проще обрабатывать каждый запрос в отдельном потоке и всё. Иначе выйдет мешанина из асинка и потоков…
При большом уровне конкуренси потоки будут сильно хуже event-loop.
<?php
class My extends Thread
{
public $pid = 0;
public function run()
{
echo 'Thread start #' . $this->pid . "\n";
sleep(1);
echo 'Thread end #' . $this->pid . "\n";
}
}
$time = time();
for ($i=0; $i<4; $i++) {
$my = new My();
$my->pid = $i;
$my->start();
}
echo 'Time ' . (time() - $time) . 's' . "\n";
<?php
class My extends Thread
{
public $pid = 0;
public function run()
{
echo 'Thread start #' . $this->pid . "\n";
ob_start();
for($i=0; $i<999999; $i++) {
echo 'num: ' . $i;
}
ob_end_clean();
echo 'Thread end #' . $this->pid . "\n";
}
}
$time = microtime(true);
for ($i=0; $i<5; $i++) {
$my = new My();
$my->pid = $i;
$my->start();
}
echo 'Time ' . (microtime(true) - $time) . 'ms' . "\n";
Thread start #0
Thread end #0
Thread start #1
Thread end #1
Thread start #2
Thread end #2
Thread start #3
Thread end #3
Thread start #4
Time 1.370078086853ms
Thread end #4
<?php
class Child extends Thread
{
public function run()
{
$time = microtime(true);
for($i=0; $i<9999999; $i++) {}
echo 'Thread time ' . (microtime(true) - $time) . 'ms' . "\n";
}
}
$time = microtime(true);
$my = new Child();
$my->start();
for ($i=0; $i<9999999; $i++) {}
echo 'Main time ' . (microtime(true) - $time) . 'ms' . "\n";
Main time 0.70203995704651ms
Thread time 0.71104001998901ms
{ "suggest": { "ext-libevent": ">=0.1.0", "ext-event": "~1.0", "ext-libev": "*" } }
GIL — в один момент времени выполняется только один потокНе совсем так, лучше сказать, что в один момент работает только один питон код. При этом IO или вызовы расширений (написанных например на С) будут работать параллельно. Например можно загрузить все ядра одним процессом где в разных потоках запустить распаковку/запаковку данных.
In [1]: import dis
In [2]: def f(a, b):
...: a += b
...:
In [3]: dis.dis(f)
2 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 INPLACE_ADD
7 STORE_FAST 0 (a)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
И я стараюсь избегать влияния фреймворка на архитектуру приложения, если оно чуть сложнее, чем персональная страничка.А фреймворк разве не по определению жестко задает структуру приложения, во всяком случае на низших уровнях?
Все ошибки используют стандартный механизм исключений и могут быть перехвачены (разве что за исключением SyntaxError).Как это как это.
In [2]: try:
...: import test
...: except Exception as e:
...: pass
...:
In [3]: e
Out[3]: SyntaxError('invalid syntax', ('test.py', 1, 10, 'import def\n'))
\n‐разделённой C’шной строки (особенность реализации, которую мне придётся поддерживать).
Web-разработка на Python глазами PHP-программиста