【问题标题】:Python Socket async send and receive designPython Socket 异步收发设计
【发布时间】:2013-03-02 12:30:45
【问题描述】:

我正在编写一个 python 套接字客户端

  1. 每 5 秒发送一次 message one(例如 Hello),每 15 秒发送一次 message two(例如 15 秒)
  2. 随时接收消息

我的意思是在不同的线程中进行发送和接收。但是,它仍然处于阻塞状态。 有人有建议吗?

线程#1

threading.Thread(target=Thread2, args=(sock)).start()
sock.recv(1024)

线程#2

def Thread2(sock):
    count = 0
    while True:
        sleep(5)
        count = count + 5
        sock.send('Hello')
        if count % 15 == 0
            sock.send('15 seconds')

【问题讨论】:

  • 如果您想得到答案,请将您编写的代码的相关部分发布。否则您将面临关闭问题的风险
  • 感谢您的建议
  • @Winston 代码不足。您如何创建这些线程?
  • 我添加了socket代码

标签: python sockets


【解决方案1】:

它没有阻塞。只是你的主线程在第一个sock.recv(1024) 之后什么都不做。你必须告诉它不断收集数据:

主线

threading.Thread(target=Thread2, args=(sock,)).start()
while True:
    data = sock.recv(1024)
    if not data:
        break
    print data

请注意,您将无法轻易中断该过程。为此,您需要将线程设置为守护进程:

主线

t = threading.Thread(target=Thread2, args=(sock,))
t.daemon = True
t.start()
while True:
    data = sock.recv(1024)
    if not data:
        break
    print data

当你传递args 时,记得传递一个元组,即args=(sock,) 而不是args=(sock)。对于 Python,args=(sock) 等价于 args=sock。这可能是罪魁祸首!

我在您的代码中看不到更多问题。

【讨论】:

  • 感谢您的回答。我只知道 python 提供了一个名为 asyncore/asynchat 的模块。我可以用它来实现非阻塞 I/O 吗?
  • @Winston 很抱歉这么晚的回复(不知何故我错过了这个问题)。是的,您可以将它用于非阻塞 I/O(我在工作中一直使用 asyncore)。
  • 这个实现是线程安全的吗?
  • @ReeshabhRanjan 你到底是什么意思?套接字操作是线程安全的,典型的操作系统会保证这一点。虽然并行写入可能会导致交错结果,而并行读取可能会导致部分结果。
  • @ReeshabhRanjan 不,不会。只要只有两个线程,一个只读一个只写就没有问题。
猜你喜欢
  • 2013-07-19
  • 2015-11-07
  • 2012-10-07
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2017-03-09
相关资源
最近更新 更多