首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP _read/recv阻塞python的socket.send

PHP _read/recv阻塞python的socket.send
EN

Stack Overflow用户
提问于 2016-04-07 15:20:20
回答 1查看 259关注 0票数 0

我正在用Python与JS+PHP客户端一起构建一个Firebird事务管理器。Javascript将所有必要的信息发送给PHP;PHP对此进行编码,并通过套接字将其发送到Python,Python有一个套接字绑定到一个端口,并通过线程异步处理该请求,并创建了一个新线程。

python中的accept循环:

代码语言:javascript
复制
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块:

代码语言:javascript
复制
$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中的响应(没有一个按预期工作):

代码语言:javascript
复制
$buf = 'buffer';
socket_recv($sock, $buf, 1024, MSG_WAITALL);
echo $buf;

与以前的实现相同,7/8线程“限制”

代码语言:javascript
复制
$buf = 'buffer';
socket_recv($sock, $buf, 1024, MSG_DONTWAIT);
echo $buf;

正如标志所暗示的,不等待响应,因此没有响应

代码语言:javascript
复制
while ($out = socket_read($sock, 1024, PHP_NORMAL_READ)) {
    echo $out;
}

相同的线程7/8线程限制。

第二次编辑:

添加了Python打印,以防有帮助。

在php中读取的

代码语言:javascript
复制
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的读取

代码语言:javascript
复制
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,查询就会同时启动,并在准备就绪后立即返回。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-12 16:00:10

原来这是浏览器的问题。Chrome (可能是其他现代浏览器)同时只支持最多6个ajax调用。

因为我有那7根线“帽子”,其中一条是主线。这条线很完美。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36480520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档