Python 带阻塞的多线程 I/O
Python Multi Threading with Blocking I/O
我的应用程序使用多个 I/O 阻塞(网络)请求,这些请求需要一段时间才能完成。
我尝试使用多线程,但它似乎没有带来任何加速,我猜这与 Python 的 GIL 有关。
问题是所有请求都可以同时完成并且彼此之间没有依赖关系。我该如何解决这个性能问题?
我的代码
import threading
import urllib2
import time
def send_request(url, count_str):
start_time = time.time()
urllib2.urlopen(url)
print "Request " + count_str + " took " + str(time.time() - start_time) + " started at " + str(start_time)
count = 0
for url in open('urllist.txt'):
t = threading.Thread(target=send_request, args = (url.strip(), str(count)))
t.start()
count+=1
输出是
Request 1 took 5.0150949955 started at 1458789266.78
Request 2 took 10.0112490654 started at 1458789266.79
Request 0 took 15.024559021 started at 1458789266.78
Request 3 took 20.016972065 started at 1458789266.79
urllist.txt 中的 url 指向我在本地 运行 的服务器,需要 5 秒才能响应。
如您所见,它们同时 "start",但它们正在阻塞。
Python 线程很慢! Python 有一个 GIL(全局解释器锁),它使用互斥体来序列化对内部的访问。您可能想看看没有 GIL 并且可以充分利用多处理器系统的 Jython。
我无法重现您的问题(在针对少数 Internet 服务器进行测试时,每个服务器重复几次,所有请求都在大约同一时间得到服务,延迟没有稳定增加),但您的新输出指向完全不同的问题:我怀疑您使用的 "local server" 可能不是多线程的(或者不能同时处理多个请求)。
您自己的输出表明线程是并行启动的,但请求是串行处理的;如果是 GIL 切换导致问题,我希望看到所有这些都延迟一点(一个线程会完成一些工作,然后另一个会做更多的工作,等等),而不是每个 运行 完成之前下一个开始。这似乎是服务器端的问题,服务器在处理额外连接之前处理请求直至完成。
试一下通灵调试,你有没有通过在服务器代码中添加一个睡眠来实现五秒的请求时间,可能在 accept
returns 之后,但在启动线程之前服务吗?或者根本不在服务器上使用线程?
我的应用程序使用多个 I/O 阻塞(网络)请求,这些请求需要一段时间才能完成。 我尝试使用多线程,但它似乎没有带来任何加速,我猜这与 Python 的 GIL 有关。
问题是所有请求都可以同时完成并且彼此之间没有依赖关系。我该如何解决这个性能问题?
我的代码
import threading
import urllib2
import time
def send_request(url, count_str):
start_time = time.time()
urllib2.urlopen(url)
print "Request " + count_str + " took " + str(time.time() - start_time) + " started at " + str(start_time)
count = 0
for url in open('urllist.txt'):
t = threading.Thread(target=send_request, args = (url.strip(), str(count)))
t.start()
count+=1
输出是
Request 1 took 5.0150949955 started at 1458789266.78
Request 2 took 10.0112490654 started at 1458789266.79
Request 0 took 15.024559021 started at 1458789266.78
Request 3 took 20.016972065 started at 1458789266.79
urllist.txt 中的 url 指向我在本地 运行 的服务器,需要 5 秒才能响应。 如您所见,它们同时 "start",但它们正在阻塞。
Python 线程很慢! Python 有一个 GIL(全局解释器锁),它使用互斥体来序列化对内部的访问。您可能想看看没有 GIL 并且可以充分利用多处理器系统的 Jython。
我无法重现您的问题(在针对少数 Internet 服务器进行测试时,每个服务器重复几次,所有请求都在大约同一时间得到服务,延迟没有稳定增加),但您的新输出指向完全不同的问题:我怀疑您使用的 "local server" 可能不是多线程的(或者不能同时处理多个请求)。
您自己的输出表明线程是并行启动的,但请求是串行处理的;如果是 GIL 切换导致问题,我希望看到所有这些都延迟一点(一个线程会完成一些工作,然后另一个会做更多的工作,等等),而不是每个 运行 完成之前下一个开始。这似乎是服务器端的问题,服务器在处理额外连接之前处理请求直至完成。
试一下通灵调试,你有没有通过在服务器代码中添加一个睡眠来实现五秒的请求时间,可能在 accept
returns 之后,但在启动线程之前服务吗?或者根本不在服务器上使用线程?