这太疯狂了!我听说Python线程很慢,但这是不正常的。
这是伪代码:
class ReadThread:
v = []
def __init__(self, threaded = True):
self.v = MySocket('127.0.0.1')
if threaded:
thread.start_new_thread(self._scan, ())
def read(self):
t0 = datetime.now()
self.v.read('SomeVariable')
t = datetime.now()
dt = (t-t0).total_seconds()
print dt
def _scan(self):
while True:
self.read()
如果我在主线程中的while循环中运行read(),如下所示:
r = ReadThread(threaded = False)
while True:
r.read()
dt约为78 ms,变化很小。现在如果我在这样的新线程中运行它:
r = ReadThread(threaded = True)
while True:
pass
dt约为130毫秒,差异为+ 10毫秒!
为什么这么慢?我做错了吗?只是在一个新的线程中它是一样的!
MySocket()是一个对象,它使用套接字读取/写入服务器的变量,而read()只是为测试获取一些变量。
答案 0 :(得分:2)
很难在不知道MySocket
是什么的情况下在本地重现这个问题,以及完整的例子。但是,我可以尝试猜测,问题就在于这个循环:
while True:
pass
非常耗费CPU。 CPU一直在四处走动,将CPU周期带到自身,而不是让套接字工作。
相反,套接字读取操作通常会阻塞和空闲以使数据到达,因此它们几乎不占用CPU。
在第一个示例中,您运行套接字而没有其他任何东西吃CPU。在第二个示例中,主线程完全消耗1个CPU。
尝试用通常的空转操作替换此循环,例如time.sleep(60)
。因此,主线程将空闲60秒,而套接字线程将读取和处理数据。
r = ReadThread(threaded = True)
time.sleep(60)
那么在那种情况下测量的是什么呢?