2005年08月17日 星期三 18:41
1. socket模块中recv有没有不阻塞方式调用, 即当没有读到数据时直接返回? 2. 如何停止一个死循环的线程? 今天仔细看了python manual socket模块的文档, 好像是可以设置, 但是类socket好像没有设置这个参数的函数 线程就没有停止的函数了, 唯一提到的是 a. 线程发生异常, b. 正常结束 可以停止线程 但是我的需要是: 在一个线程中运行一个socket.recv功能的函数, 不断从socket中接收数据(死循环), 然后通过Queue传送给另一个线程, 但是我现在需要 我在GUI端可以控制, 开始线程和停止线程 在这里, 假如使用全局变量标志, 线程中当检测到标志时抛出异常, 检测异常来停止线程, 但是, 由于socket.recv读数据时会阻塞(socket中没有数据时), 所以有可能还没有运行到检测标记时就被socket.recv阻塞, 那么线程就没有办法停止, 这不符合我的要求 所以, 请教, 在这里有没有好方法解决这个小小的问题, 谢谢 --------------------------------- DO YOU YAHOO!? 雅虎免费G邮箱-No.1的防毒防垃圾超大邮箱 -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050817/cc8a0388/attachment.html
2005年08月17日 星期三 18:46
在 05-8-17,泰传 温<wendwghit at yahoo.com.cn> 写道: > 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
2005年08月17日 星期三 20:15
十分感谢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的防毒防垃圾超大邮箱 -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050817/d5d6b0ee/attachment.html
Zeuux © 2025
京ICP备05028076号