Python 多线程无法处理阻塞 I/O 操作

Python Multithreading not working on Blocking I/O operations

我根据“基础Python 第二版”一书中的示例创建了一个Python 脚本,该脚本使用线程来优化阻塞i/o 操作。代码如下:

import select
import socket
import time
from threading import Thread


def slow_systemcall():
    # Running the linux select system call, with 0.1 second timeout
    select.select([socket.socket()], [], [], 0.1)

# First, run it linearly
start = time.time()

for _ in range(5):
    slow_systemcall()

end = time.time()
delta = end - start
print(f"Took {delta:.3f} seconds")

# Now, run it using threads
start = time.time()
threads = []
for _ in range(5):
    thread = Thread(target=slow_systemcall())
    thread.start()
    threads.append(thread)

for thread in threads:
    thread.join()

end = time.time()
delta = end - start
print(f"Took {delta:.3f} seconds")

我原以为第一次打印大约是“耗时 0.510 秒”,第二次打印大约是“耗时 0.108 秒”,两者之间存在巨大差异。

但是,我得到的是 “用了 0.520 秒” 和 “花了 0.519 秒”

我在 Python 3.8 Mac 和 Python 3.6.9 Linux 中测试了这个。两者都产生相似的结果,其中多线程使用似乎根本没有加速阻塞 i/o 操作。

我做错了什么?

编辑:我注意到有些奇怪并替换了这一行

thread = Thread(target=slow_systemcall())

用这条线

thread = Thread(target=slow_systemcall)

它会立即按预期运行。为什么会这样?

您需要给新的 Thread() 函数对象。

通过添加调用 Thread(target=slow_systemcall()) 调用函数然后传递结果而不是传递函数本身。

Thread(target=slow_systemcall) 但是传递函数,新线程调用它。

要回答您的编辑,您必须知道括号不是方法名称的一部分,而是用于调用它。因此,添加它们导致调用 slow_systemcall 方法本身并将其结果传递给目标参数。