假设我有一个写入文件的函数.我还有一个循环重复读取所述文件的函数.我有这两个函数在不同的线程中运行.(实际上我正在通过MDIO读/写寄存器,这就是为什么我不能同时执行两个线程,只有一个或另一个,但为了简单起见,我们只是说它是一个文件)
现在,当我单独运行write函数时,它执行得相当快.但是,当我运行线程并让它在运行之前获得锁定时,它似乎运行得非常慢.这是因为第二个线程(读取函数)轮询获取锁定?有没有办法解决这个问题?
我目前只使用一个简单的RLock,但我愿意接受任何可以提高性能的变化.
编辑:作为一个例子,我将提供一个基本的例子,说明发生了什么.读线程基本上总是在运行,但偶尔会有一个单独的线程调用加载.如果我通过从cmd提示符运行load来进行基准测试,那么在线程中运行的速度至少要慢3倍.
写线程:
import usbmpc # functions I made which access dll functions for hardware, etc
def load(self, lock):
lock.acquire()
f = open('file.txt','r')
data = f.readlines()
for x in data:
usbmpc.write(x)
lock.release()
Run Code Online (Sandbox Code Playgroud)
读线程:
import usbmpc
def read(self, lock):
addr = START_ADDR
while True:
lock.acquire()
data = usbmpc.read(addr)
lock.release()
addr += 4
if addr > BUF_SIZE: addr = START_ADDR
Run Code Online (Sandbox Code Playgroud) Python 2.7,Windows XP.我有一个服务器向客户端发送消息.我使用select模块来检查准备好接收的套接字,以及捕获异常条件.我的印象是,如果客户端关闭套接字,select()将在异常条件的套接字列表中返回所述套接字,但它似乎没有这样做:
lin, lout, lex = select.select(socklist, socklist, socklist)
for sock in lin:
# handle incoming messages
for sock in lout:
# send updates
for sock in lex:
# shut down server-side objects for particular client
Run Code Online (Sandbox Code Playgroud)
服务器确定客户端是否仍然连接的最佳方法是什么?服务器并不总是发送数据,所以我不想依赖socket.send()来测试客户端是否仍然存在.