首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:套接字和线程?

Python:套接字和线程?
EN

Stack Overflow用户
提问于 2012-06-24 11:21:37
回答 3查看 24.2K关注 0票数 15

我有一个设计问题:

我有两个线程,一个心跳/控制线程和一个消息处理程序线程。

两者共享相同的套接字,但是messageHandler线程只发送消息而从不接收。心跳线程发送和接收(接收消息并对心跳作出反应)。

问题是我不确定这是否安全。我自己也没有实现任何机制来查看套接字是否被使用。所以在python上共享一个套接字是否自动线程安全?

如果不是的话,我把它们放在单独的线程中的原因是心跳比消息处理更重要。这意味着,如果它被信息淹没,它仍然需要做一个心跳。因此,如果我必须实现一个螺栓,那么如果我的心跳/控制线程需要发送一个心跳,我是否可以优先排序呢?

EN

回答 3

Stack Overflow用户

发布于 2014-09-27 02:49:47

一个更好的方法,而不是使用第三个线程是使用threading.Lock()保护套接字资源,因为这消除了第三个线程的需要。与第三个线程相比,您的开销更低,延迟更短。

代码语言:javascript
复制
import threading

lock = threading.Lock()

def sendfunction(sock, data):
    with lock:
        sock.send(data)

您可以从任何一个线程调用它,但一次只允许一个线程调用sock.send。当一个线程到达已被另一个线程锁定的锁时,它将一直处于休眠状态,直到另一个线程释放该锁,然后它将获得锁,进程将重复。

线程模块包含Lock__、RLock__和Condition,它们在处理多线程时都非常有用,您会发现很值得花时间熟悉它们及其使用。

您可以将心跳合并到消息处理中,方法是在处理每条消息之前检查当前时间和最后一次发送心跳的时间,这样可以防止大量消息导致心跳不被发送。问题是,如果您的消息处理代码不运行,那么就不会发送心跳。您可以通过让您的消息处理代码在间隔期间获取一个虚拟消息来检查它是否需要发送心跳而忽略虚拟消息来缓解这一问题。

您应该尽量少地使用线程(针对单个线程),但是在您的示例中,线程可能是可以的,因为它将花费大部分时间睡觉。但是,您不应该使用守护进程线程,因为它们没有正确关闭。虽然损坏在您的情况下可能是不存在的,如果它没有正确关闭,它仍然可能抛出某种类型的错误(错误消息),这看起来很糟糕。

我不同意多套接字方法,因为我认为这实际上会使情况复杂化。您将发现有许多类型的网络服务/应用程序将心跳和消息合并到单个套接字字节流中。

票数 21
EN

Stack Overflow用户

发布于 2012-06-24 11:28:26

我不知道在Python级别上有什么优先排序的方法。

因此,我建议使用两个进程,而不是线程,并在操作系统级别优先排序。在Unix上,您可以使用os.nice()来实现这一点。

那么,您需要使用两个套接字,并且您的共享问题将同时得到解决。

票数 0
EN

Stack Overflow用户

发布于 2012-06-24 11:39:15

如果两个线程都是客户端线程,那么最好打开两个客户端套接字--一个用于心跳,另一个用于通信。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11177018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档