Python 侦听多线程中的套接字输入
我正在使用python套接字 问题出在这里。我有两个线程:Python 侦听多线程中的套接字输入,python,multithreading,sockets,Python,Multithreading,Sockets,我正在使用python套接字 问题出在这里。我有两个线程: 一个线程侦听来自远程的套接字输入并回复它 一个线程轮询文件,如果文件中存在某些内容,则发送 套接字并期望响应 现在的问题是在第二个线程的情况下,当我发送一些东西时,响应没有到达这个线程。而是(1)点中提到的线程 这是线程(1) 这是从线程(2)运行的 有人能解释一下这种行为吗?我过去也遇到过类似的问题。当在一个线程中启动阻塞操作侦听连接,而在另一个线程中通过同一套接字发送时,就会发生这种情况 如果我理解得很好,您总是希望接收
- 一个线程侦听来自远程的套接字输入并回复它
- 一个线程轮询文件,如果文件中存在某些内容,则发送 套接字并期望响应
这是从线程(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
,使用以下代码,以避免显式获取和释放锁
我希望它有帮助请用您尝试过的代码片段来支持您的问题。让其他人更容易理解这个问题。