小编Sha*_*min的帖子

Python:线程+锁定大大减慢了我的应用程序

假设我有一个写入文件的函数.我还有一个循环重复读取所述文件的函数.我有这两个函数在不同的线程中运行.(实际上我正在通过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 multithreading locking

5
推荐指数
1
解决办法
4075
查看次数

select.select()没有捕获socket上的异常条件?

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()来测试客户端是否仍然存在.

python sockets select

4
推荐指数
1
解决办法
2538
查看次数

标签 统计

python ×2

locking ×1

multithreading ×1

select ×1

sockets ×1