���ʼ���þ�û�ʼ��ˡ����������Ų��С����ո����֡�
ԭ��һ�δ�����ʹ�ñ���ʽ��Ϣ���գ�����ʽ���������ij� ���ģʽ�����������Ī��ʧЧ���Ų���룬���ʽ���£�
start() -> {ok, Listen} = gen_tcp:listen(8080,[{active,once}].
...........
loop_accept(Listen) ->case gen_tcp:accept(Listen) of{ok, Socket} ->spawn(fun()->loop_socket(Socket) end),loop_accept(Listen)end.
loop_socket(Socket) ->receive{tcp,Socket, Binary} -> .....{tcp_closed, Socket} -> ....end.
���뱾��������յ�һ��accept��ǰ��̼�������գ���spawn�������½��������Socket�������������socket�Ͽ���spawn������loop_socket�����Ȼ���ڣ�
��Ʈ�촦�����Ϊspawn(fun()->loop_accept(Listen) end),loop_socket(Socket)
����Խ����������ǰ��̴���socket�����¿���̴���accept���ӡ�
�������ģʽ�£�socket��������Ϣ�Ƿŵ���̵�msg-box��¿����receive���ղ�����ݵģ���塣
-- ----------------- Best Regard�� �ҵ
这个错误好些人都遇到过,不过我一直觉得不太理解这个设计的深层次原因
于 2012年05月15日 16:27, Yupei 写道:
这邮件组好久没邮件了。发个今天排查的小错误凑个热闹。
原有一段代码是使用被动式消息接收(阻塞)方式,后来被改成 混合模式(半阻塞)。结果莫名失效,排查代码,基本格式如下:
start() -> {ok, Listen} = gen_tcp:listen(8080,[{active,once}].
...........
loop_accept(Listen) ->case gen_tcp:accept(Listen) of{ok, Socket} ->spawn(fun()->loop_socket(Socket) end),loop_accept(Listen)end.
loop_socket(Socket) ->receive{tcp,Socket, Binary} -> .....{tcp_closed, Socket} -> ....end.
代码本意是想接收到一个accept后,当前进程继续负责接收,用spawn出来的新进程来接手Socket请求,现在情况是socket断开后,spawn出来的loop_socket进程仍然存在,
后将飘红处代码改为spawn(fun()->loop_accept(Listen) end),loop_socket(Socket)
便得以解决。即将当前进程处理socket请求,新开进程处理accept连接。
非阻塞的模式下,socket发来的消息是放到进程的msg-box里,新开进程receive是收不到数据的,大囧。
-- ----------------- Best Regard, 李建业
���ԭ������Ϊ��Socket�Ǿ��н�����Եġ����Ҫ�������ֵ�Ч���Ҫ���� gen_tcp:controlling_process/2������socket�����µĽ�̡�
Thanks and regards,
==========================
֣�DZ�Witeman Zheng��
���ݰ�������Ƽ�����˾
�з��ܼ�
��˾���ʣ�wit...@iconventure.com
�ֻ�+86 186 2020 2930
QQ��19653403
==========================
�� 2012-5-15������4:30�� �ҵ д����
��������Щ�˶����������һֱ���ò�̫��������Ƶ�����ԭ��
�� 2012��05��15�� 16:27, Yupei �:
���ʼ���þ�û�ʼ��ˡ����������Ų��С����ո����֡�
ԭ��һ�δ�����ʹ�ñ���ʽ��Ϣ���գ�����ʽ���������ij� ���ģʽ�����������Ī��ʧЧ���Ų���룬���ʽ���£�
start() -> {ok, Listen} = gen_tcp:listen(8080,[{active,once}].
...........
loop_accept(Listen) ->case gen_tcp:accept(Listen) of{ok, Socket} ->spawn(fun()->loop_socket(Socket) end),loop_accept(Listen)end.
loop_socket(Socket) ->receive{tcp,Socket, Binary} -> .....{tcp_closed, Socket} -> ....end.
���뱾��������յ�һ��accept��ǰ��̼�������գ���spawn�������½��������Socket �������������socket�Ͽ���spawn������loop_socket�����Ȼ���ڣ�
��Ʈ�촦�����Ϊspawn(fun()->loop_accept(Listen) end),loop_socket(Socket)
����Խ����������ǰ��̴���socket�����¿���̴���accept���ӡ�
�������ģʽ�£�socket��������Ϣ�Ƿŵ���̵�msg-box��¿����receive���ղ������ �ģ������
-- ----------------- Best Regard�� �ҵ
感觉这个解释还是不够深入,为什么socket会具有进程属性呢?是刻意的设计还是别的什么原因?仅从api设计的角度看,一个process负 责不断的accept,收到socket以后分派出process进行处理更符合一般的思维习惯阿
于 2012年05月15日 16:50, Zheng Zhibin 写道:这个原因是因为,Socket是具有进程属性的。如果,要做到红字的效果,就要调用 gen_tcp:controlling_process/2来,把socket交给新的进程。
Thanks and regards,
==========================
郑智斌(Witeman Zheng)
广州安浩软件科技有限公司
研发总监
公司电邮:wit...@iconventure.com
在 2012-5-15,下午4:30, 李建业 写道:
这个错误好些人都遇到过,不过我一直觉得不太理解这个设计的深层次原因
于 2012年05月15日 16:27, Yupei 写道:
这邮件组好久没邮件了。发个今天排查的小错误凑个热闹。
原有一段代码是使用被动式消息接收(阻塞)方式,后来被改成 混合模式(半阻塞)。结果莫名失效,排查代码,基本格式如下:
start() -> {ok, Listen} = gen_tcp:listen(8080,[{active,once}].
...........
loop_accept(Listen) ->case gen_tcp:accept(Listen) of{ok, Socket} ->spawn(fun()->loop_socket(Socket) end),loop_accept(Listen)end.
loop_socket(Socket) ->receive{tcp,Socket, Binary} -> .....{tcp_closed, Socket} -> ....end.
代码本意是想接收到一个accept后,当前进程继续负责接收,用spawn出来的新进程来接手Socket 请求,
现在情况是socket断开后,spawn出来的loop_socket进程仍然存在,
后将飘红处代码改为spawn(fun()->loop_accept(Listen) end),loop_socket(Socket)
便得以解决。即将当前进程处理socket请求,新开进程处理accept连接。
非阻塞的模式下,socket发来的消息是放到进程的msg-box里,新开进程receive是收不到数据 的,大囧凵
-- ----------------- Best Regard, 李建业
感觉这个解释还是不够深入,为什么socket会具有进程属性呢?是刻意的设计还是别的什么原因?仅从api设计的角度看,一个process负 责不断的accept,收到socket以后分派出process进行处理更符合一般的思维习惯阿
于 2012年05月15日 16:50, Zheng Zhibin 写道:
这个原因是因为,Socket是具有进程属性的。如果,要做到红字的效果,就要调用 gen_tcp:controlling_process/2来,把socket交给新的进程。
Thanks and regards,
==========================
郑智斌(Witeman Zheng)
广州安浩软件科技有限公司
研发总监
公司电邮:wit...@iconventure.com
在 2012-5-15,下午4:30, 李建业 写道:
这个错误好些人都遇到过,不过我一直觉得不太理解这个设计的深层次原因
于 2012年05月15日 16:27, Yupei 写道:
这邮件组好久没邮件了。发个今天排查的小错误凑个热闹。
原有一段代码是使用被动式消息接收(阻塞)方式,后来被改成 混合模式(半阻塞)。结果莫名失效,排查代码,基本格式如下:
start() -> {ok, Listen} = gen_tcp:listen(8080,[{active,once}].
...........
loop_accept(Listen) ->case gen_tcp:accept(Listen) of{ok, Socket} ->spawn(fun()->loop_socket(Socket) end),loop_accept(Listen)end.
loop_socket(Socket) ->receive{tcp,Socket, Binary} -> .....{tcp_closed, Socket} -> ....end.
代码本意是想接收到一个accept后,当前进程继续负责接收,用spawn出来的新进程来接手Socket 请求,
现在情况是socket断开后,spawn出来的loop_socket进程仍然存在,
后将飘红处代码改为spawn(fun()->loop_accept(Listen) end),loop_socket(Socket)
便得以解决。即将当前进程处理socket请求,新开进程处理accept连接。
非阻塞的模式下,socket发来的消息是放到进程的msg-box里,新开进程receive是收不到数据 的,大囧凵
-- ----------------- Best Regard, 李建业
-- ----------------- Best Regard, 李建业
This means that usually a request is accomplished with the following steps:
Redis client和server之间是堵塞式的协议,发一个request过去,server回一个reply
Redis is a TCP server using the client-server model and what is called a Request/Response protocol.This means that usually a request is accomplished with the following steps:
- The client sends a query to the server, and reads from the socket, usually in a blocking way, for the server response.
- The server processes the command and sends the response back to the client.
现在也支持Pipelining技术,类似于批处理,就是client发N个请求过去,再顺序读N条结果,节约IO