Python:套接字和线程?

Luc*_*man 11 python sockets multithreading

我有一个设计问题:

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

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

问题是我不确定这是否安全.我自己没有实现查看套接字是否正在使用的机制.那么在python上自动共享一个套接字是否安全?

如果不是这样,我把它们放在一个单独的线程中的原因是因为心跳比消息处理更重要.这意味着如果它充满了消息,它仍然需要做一个心跳.所以,如果我必须实现一个螺栓,那么如果我的心跳/控制线程需要发送心跳,我可以优先考虑吗?

kmc*_*ire 12

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

import threading

lock = threading.Lock()

def sendfunction(sock, data):
    with lock:
        sock.send(data)
Run Code Online (Sandbox Code Playgroud)

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

线程模块包含Lock,RLock以及Condition在处理多个线程时都非常有用,您会发现值得花时间熟悉它们及其用法.

您可以通过在处理每条消息之前检查上次发送心跳的时间来将心跳合并到消息处理中,这样可以防止被消息淹没导致心跳不被发送.问题是如果您的消息处理代码没有运行,那么将不会发送心跳.您可以通过让消息处理代码在间隔上获取虚拟消息来允许它检查是否需要发送心跳并忽略虚拟消息来缓解这种情况.

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

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


yan*_*ncl 5

不幸的是,多线程共享的套接字不是线程安全的.关于缓冲区两个线程的操作,没有锁定.

正常的实现方式是使用两个套接字,就像ftp does.cmd套接字和msg套接字一样.

如果你想通过一个套接字实现它,你可以将不同类型的msgs放入不同的队列,并使用第三个线程消耗队列并通过唯一的套接字发送它们.

通过这种方式,您可以将心跳msg priory控制为数据消息.

  • 读取线程并从另一个线程发送是线程安全的吗? (5认同)
  • 有人可以通过@Colateral解决以上问题吗?我也有同样的疑问。 (2认同)