Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 侦听多线程中的套接字输入_Python_Multithreading_Sockets - Fatal编程技术网

Python 侦听多线程中的套接字输入

Python 侦听多线程中的套接字输入,python,multithreading,sockets,Python,Multithreading,Sockets,我正在使用python套接字 问题出在这里。我有两个线程: 一个线程侦听来自远程的套接字输入并回复它 一个线程轮询文件,如果文件中存在某些内容,则发送 套接字并期望响应 现在的问题是在第二个线程的情况下,当我发送一些东西时,响应没有到达这个线程。而是(1)点中提到的线程 这是线程(1) 这是从线程(2)运行的 有人能解释一下这种行为吗?我过去也遇到过类似的问题。当在一个线程中启动阻塞操作侦听连接,而在另一个线程中通过同一套接字发送时,就会发生这种情况 如果我理解得很好,您总是希望接收

我正在使用python套接字

问题出在这里。我有两个线程:

  • 一个线程侦听来自远程的套接字输入并回复它
  • 一个线程轮询文件,如果文件中存在某些内容,则发送 套接字并期望响应
现在的问题是在第二个线程的情况下,当我发送一些东西时,响应没有到达这个线程。而是(1)点中提到的线程

这是线程(1)

这是从线程(2)运行的


有人能解释一下这种行为吗?

我过去也遇到过类似的问题。当在一个线程中启动阻塞操作侦听连接,而在另一个线程中通过同一套接字发送时,就会发生这种情况

如果我理解得很好,您总是希望接收来自先前发送数据的响应。为了解决这个问题,我会使用锁来强制这种行为,所以只需创建一个类:

from threading import Lock

class ConnectionSession:
  def __init__(self, address, conn):
    self.ip = address[0]  # Optional info
    self.port = address[1] # Optional info
    self.conn = conn
    self.lock = Lock()
下面介绍如何在创建侦听套接字时正确创建ConnectionSession对象:

address = ('127.0.0.1', 46140)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(address)
conn, addr = s.accept()
session = ConnectionSession(addr, conn)
address = ('127.0.0.1', 46140)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(address)
session = ConnectionSession(address, s)
在创建“发送”连接时会出现以下情况:

address = ('127.0.0.1', 46140)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(address)
conn, addr = s.accept()
session = ConnectionSession(addr, conn)
address = ('127.0.0.1', 46140)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(address)
session = ConnectionSession(address, s)
请记住,创建的会话实例是需要在线程之间共享的实例

之后,要通过共享套接字发送信息,您可以在每个线程中执行以下操作:

# Previous code
try:
    session.lock.acquire()
    session.conn.sendall("Hi there buddy!")
    # Do something if needed
    message = session.conn.recv(1024)
except Exception as e:
    print "Exception e=%s should be handled properly" % e
finally:
    if session.lock.locked():
        session.lock.release()
# Other code
请注意,finally块很重要,因为无论操作是否成功,它都将释放锁定的连接

您还可以将前面的代码包装到类中,例如:
SocketManager
,使用以下代码,以避免显式获取和释放锁


我希望它有帮助

请用您尝试过的代码片段来支持您的问题。让其他人更容易理解这个问题。