Python论坛  - 讨论区

标题:[python-chinese] 请问, socket和线程的问题

2005年08月17日 星期三 18:41

泰传 温 wendwghit at yahoo.com.cn
Wed Aug 17 18:41:56 HKT 2005

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

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

2005年08月17日 星期三 18:46

limodou limodou at gmail.com
Wed Aug 17 18:46:50 HKT 2005

在 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

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

2005年08月17日 星期三 20:15

泰传 温 wendwghit at yahoo.com.cn
Wed Aug 17 20:15:05 HKT 2005

十分感谢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

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

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

    你的回复:

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

    Zeuux © 2025

    京ICP备05028076号