2005年08月17日 星期三 23:47
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
2005年08月19日 星期五 10:10
估计你忽略了一点,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 > > > -- 梅劲松
Zeuux © 2025
京ICP备05028076号