PHP socket_read / recv блокирует python для socket.send

Я создаю менеджер транзакций Firebird DB в Python для Linux с клиентами JS + PHP. Javascript отправляет всю необходимую информацию в PHP; PHP кодирует это и отправляет его через сокет в Python, который имеет сокет, привязанный к порту, который постоянно прослушивает, и создает новый поток, использующий потоки для асинхронной обработки этого запроса.

Цикл принятия в python:

while 1:
conn, addr = s.accept()

req = conn.recv(1024)
ret = read_headers(req)

threading.Thread(target=client_thread, args=(conn, addr, ret, smphr,)).start()
s.close()

Блок отправки / чтения в php:

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$sockconnect = socket_connect($sock, $host, $port);
$msg = urldecode(http_build_query($params));
socket_write($sock, $msg, strlen($msg));
$received;
while(socket_recv($sock, $buf, 1024, 0) >= 1){
$received .= $buf;
}
echo $received;
socket_close($sock);

Кажется, все работает правильно, пока мы не начали тестирование с большим количеством соединений. У меня есть цикл в клиенте JS, который отправляет несколько (25-100 — это числа, которые я использовал до сих пор) запросов с выбором первого случайного числа строк из большой таблицы.

Первые несколько запросов, которые получает сервер, обрабатываются одновременно, но затем они становятся синхронными.

После долгой регистрации выяснилось, что в данный момент активны только 7/8 потоков. Новые запросы принимаются и обрабатываются только после завершения одного из 7 текущих.

Если я прокомментирую цикл socket_recv while в php, то python запустит все одновременно и вернется, как только станет доступным, и это именно то, что я хочу, но, поскольку я прокомментировал блок, который фактически получает результат, ничего не отображается (очевидно, ).

Каждый запрос / запрос регистрируется как отдельный вызов скрипта (в соответствии с инструментом разработчика сети Chrome), поэтому я не знаю, почему они блокируют друг друга.

Я довольно новичок в php / python и не могу понять, что происходит.

Какие-либо предложения?

Редактировать:
Я также пробовал разные куски кода, чтобы прочитать ответ в php (ни один не работал как задумано):

$buf = 'buffer';
socket_recv($sock, $buf, 1024, MSG_WAITALL);
echo $buf;

То же, что и в предыдущей реализации, 7/8 поток ‘limit’

$buf = 'buffer';
socket_recv($sock, $buf, 1024, MSG_DONTWAIT);
echo $buf;

Как следует из флага, не ожидает ответа, поэтому не имеет ответа

while ($out = socket_read($sock, 1024, PHP_NORMAL_READ)) {
echo $out;
}

Та же нить 7/8 лимит нитей.

Второе редактирование:

Добавлены отпечатки Python, на случай, если это поможет.

С прочитанным в php:

starting select first 3000 * from receb_quotas on tr1
starting select first 1 * from receb_quotas on tr0
starting select first 1 * from receb_quotas on tr2
starting select first 1 * from receb_quotas on tr4
starting select first 3000 * from receb_quotas on tr3
starting select first 3000 * from receb_quotas on tr5
finishing tr4 (count: 1) | remaining threads: 7
finishing tr0 (count: 1) | remaining threads: 7
starting select first 150 * from receb_quotas on tr8
starting select first 3000 * from receb_quotas on tr6
finishing tr2 (count: 1) | remaining threads: 7
starting select first 1 * from receb_quotas on tr7
finishing tr7 (count: 1) | remaining threads: 7
starting select first 3000 * from receb_quotas on tr9
finishing tr8 (count: 150) | remaining threads: 7
finishing tr1 (count: 3000) | remaining threads: 6
finishing tr3 (count: 3000) | remaining threads: 5
finishing tr6 (count: 3000) | remaining threads: 4
finishing tr5 (count: 3000) | remaining threads: 3
finishing tr9 (count: 3000) | remaining threads: 2

Без чтения php:

starting select first 3000 * from receb_quotas on tr1
starting select first 15 * from receb_quotas on tr0
starting select first 15 * from receb_quotas on tr3
starting select first 3000 * from receb_quotas on tr4
starting select first 1500 * from receb_quotas on tr2
starting select first 150 * from receb_quotas on tr5
starting select first 1 * from receb_quotas on tr6
starting select first 1500 * from receb_quotas on tr7
starting select first 150 * from receb_quotas on tr8
starting select first 15 * from receb_quotas on tr9
finishing tr0 (count: 15) | remaining threads: 11
finishing tr3 (count: 15) | remaining threads: 10
finishing tr6 (count: 1) | remaining threads: 9
finishing tr9 (count: 15) | remaining threads: 8
finishing tr8 (count: 150) | remaining threads: 7
finishing tr5 (count: 150) | remaining threads: 6
finishing tr7 (count: 1500) | remaining threads: 5
finishing tr2 (count: 1500) | remaining threads: 4
finishing tr1 (count: 3000) | remaining threads: 3
finishing tr4 (count: 3000) | remaining threads: 2

На самом деле кажется, что без чтения в php все запросы запускаются одновременно и возвращаются, как только будут готовы.

0

Решение

Оказывается, это была проблема браузера. Chrome (возможно, другие современные браузеры) поддерживает только до 6 вызовов ajax одновременно.

Так как у меня была эта «шапка» из 7 нитей, одна из которых была основной. Это выстраивается идеально.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]