我正在用Python与JS+PHP客户端一起构建一个Firebird事务管理器。Javascript将所有必要的信息发送给PHP;PHP对此进行编码,并通过套接字将其发送到Python,Python有一个套接字绑定到一个端口,并通过线程异步处理该请求,并创建了一个新线程。
python中的accept循环:
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中的send/read块:
$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个请求完成后才会被接受和处理。
如果我在php中注释了socket_recv while循环,那么python将同时运行所有东西,并在可用时立即返回,这正是我想要的,但是由于我已经注释了实际得到结果的块,所以没有显示任何内容(很明显)。
每个请求/查询都被记录为不同的脚本调用(根据chrome的network工具),所以我不知道它们为什么相互阻塞。
我在php/python还是个新手,我一辈子都搞不懂到底是怎么回事。
有什么建议吗?
编辑:我也尝试过用不同的代码来读取php中的响应(没有一个按预期工作):
$buf = 'buffer';
socket_recv($sock, $buf, 1024, MSG_WAITALL);
echo $buf;与以前的实现相同,7/8线程“限制”
$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实际上,如果没有ready,查询就会同时启动,并在准备就绪后立即返回。
发布于 2016-04-12 16:00:10
原来这是浏览器的问题。Chrome (可能是其他现代浏览器)同时只支持最多6个ajax调用。
因为我有那7根线“帽子”,其中一条是主线。这条线很完美。
https://stackoverflow.com/questions/36480520
复制相似问题