Python论坛  - 讨论区

标题:[python-chinese] 转发: 请问, socket和线程的问题(回复)

2005年08月17日 星期三 23:47

泰传 温 wendwghit at yahoo.com.cn
Wed Aug 17 23:47:37 HKT 2005

Skipped content of type multipart/alternative-------------- next part --------------
An embedded message was scrubbed...
From: =?gb2312?q?=CC=A9=B4=AB=20=CE=C2?= <wendwghit at yahoo.com.cn>
Subject: =?gb2312?q?=C7=EB=CE=CA,
	=20socket=BA=CD=CF=DF=B3=CC=B5=C4=CE=CA=CC=E2(=BB?=
	=?gb2312?q?=D8=B8=B4)?=
Date: Wed, 17 Aug 2005 20:15:05 +0800 (CST)
Size: 10427
Url: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050817/e94deef8/attachment.mht

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年08月19日 星期五 10:10

梅劲松  stephen.cn at gmail.com
Fri Aug 19 10:10:23 HKT 2005

估计你忽略了一点,settimeout这个函数。虽然我没有看源代码,但是socket默认的时间是300秒,也就是几分钟才能发生一次异常,我想效率是非常低的。
你可以settimeout(0.01),这样你的接收速度才能提高,否则数据是会丢掉的。

在 05-8-17,泰传 温<wendwghit at yahoo.com.cn> 写道:
> 
> 
> 注:已附加转发邮件。
> 
> ________________________________
> DO YOU YAHOO!?
> 雅虎免费G邮箱-中国第一绝无垃圾邮件骚扰超大邮箱 
> 
> 
> 
> ---------- 已转发邮件 ----------
> From: 泰传 温 <wendwghit at yahoo.com.cn>
> To: python-chinese at lists.python.cn
> Date: Wed, 17 Aug 2005 20:15:05 +0800 (CST)
> Subject: 请问, socket和线程的问题(� 馗�
> 十分感谢limodou
>  
> 刚才用工具在开源软件ABC-win32-v3.0.1b( 一个BT的实现)的代码中找了一边, 找到这么个文件SocketHandler.py,
> 在里面实现了不堵塞的socket, 它是这样设置的.setblocking(0), 
> try:
>                 server = socket.socket(addrinfo[0], socket.SOCK_STREAM)
>                 if reuse:
>                     server.setsockopt(socket.SOL_SOCKET,
> socket.SO_REUSEADDR, 1)
>                 server.setblocking(0)
>                 server.bind(addrinfo[4])
>                 self.servers[server.fileno()] = server
>                 if bind:
>                     self.interfaces.append(server.getsockname()[0])
>                 server.listen(64)
>                 self.poll.register(server, POLLIN)
>             except socket.error, e:
>                 for server in self.servers.values():
>                     try:
>                         server.close()
>                     except:
>                         pass
> 然后读的时候
>                    try:
>                         s.last_hit = clock()
>                         data = s.socket.recv(100000)
>                         if not data:
>                             self._close_socket(s)
>                         else:
>                             s.handler.data_came_in(s, data)
>                     except socket.error, e:
>                         code, msg = e
>                         if code != EWOULDBLOCK:
>                             self._close_socket(s)
>                             continue
>  
> 当不堵塞时, 读取不到数据时产生code == EWOULDBLOCK(10035)的异常, 检测这个异常就可以知道读不到数据了, 在使用未堵塞的时候,
> 根据它的代码来看, 使用自己实现的缓存的方式处理
> 这个工程的代码在sourceforge上面可以下载
>  
> 当使用未阻塞socket时, python cookbook上就介绍了如何中断一个线程, 就是设置变量, 循环时检测变量状态, 根据状态决定是否退出
> 
> 关于select, 看了看文档, 感觉比较负责, 也就没有使用了
>  
> 再次感谢limodou 的帮助
> 
> limodou <limodou at gmail.com> 写道:
> 在 05-8-17,泰传 温 写道:
> > 1. socket模块中recv有没有不阻塞方式调用, 即当没有读到数据时直接返回? 
> 
> 是否可以考虑先使用select来判断是否有数据?
> 
> > 2. 如何停止一个死循环的线程? 
> > 
> 
> 将线程设置为setDaemon(True),这样在程序退出时会自动结束。
> 
> > 今天仔细看了python manual socket模块的文档, 好像是可以设置, 但是类socket好像没有设置这个参数的函数 
> > 
> > 线程就没有停止的函数了, 唯一提到的是 a. 线程发生异常, b. 正常结束 可以停止线程 
> > 
> > 但是我的需要是: 
> > 在一个线程中运行一个socket.recv功能的函数, 不断从socket中接收数据(死循环), 然后通过Queue传送给另一个线程,
> 但是我现在需要
> > 我在GUI端可以控制, 开始线程和停止线程 
> > 
> > 在这里, 假如使用全局变量标志, 线程中当检测到标志时抛出异常, 检测异常来停止线程, 但是,
> > 由于socket.recv读数据时会阻塞(socket中没有数据时), 所以有可能还没有运行到检测标记时就被socket.recv阻塞,
> > 那么线程就没有办法停止, 这不符合我的要求 
> > 
> > 所以, 请教, 在这里有没有好方法解决这个小小的问题, 谢谢
> > 
> 
> 
> -- 
> I like python! 
> My Donews Blog: http://www.donews.net/limodou
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> ________________________________
> DO YOU YAHOO!?
> 雅虎免费G邮箱-No.1的防毒防垃圾超大邮箱 
> 
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
梅劲松

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号