我正在创建一个HTTP客户端,它可以每秒生成数百个连接,并在每个连接上发送最多10个请求。我正在使用线程,因此可以实现并发。 这是我的代码:
def generate_req(reqSession):
requestCounter = 0
while requestCounter < requestRate:
try:
response1 = reqSession.get('http://20.20.1.2/tempurl.html')
if response1.status_code == 200:
client_notify('r')
except(exceptions.ConnectionError, exceptions.HTTPError, exceptions.Timeout) as Err:
client_notify('F')
break
requestCounter += 1
def main():
for q in range(connectionPerSec):
s1 = requests.session()
t1 = threading.Thread(target=generate_req, args=(s1,))
t1.start()
的问题:
请求速率= 1时,它不会超过200个连接/秒。我在同一个客户端计算机上运行其他可用的HTTP客户端,并且在服务器上运行,测试运行正常并且能够扩展。
当requestRate = 10时,connections / sec降至30。 原因:无法每秒创建目标数量的线程。
对于问题#2,客户端计算机无法创建足够的请求会话并启动新线程。一旦requestRate设置为大于1,事情就会开始崩溃。 我怀疑它与请求使用的HTTP连接池有关。
请在这里建议我做错了什么。
答案 0 :(得分:1)
我无法解决问题,但以下代码有一些新功能:
1)扩展日志记录,包括特定的每线程信息
2)所有帖子join()
在末尾编辑以确保父进程不会让它们挂起
3)多线程print
倾向于交错消息,这可能是笨拙的。此版本使用yield
,因此将来的版本可以接受这些消息并清楚地打印出来。
import exceptions, requests, threading, time
requestRate = 1
connectionPerSec = 2
def client_notify(msg):
return time.time(), threading.current_thread().name, msg
def generate_req(reqSession):
requestCounter = 0
while requestCounter < requestRate:
try:
response1 = reqSession.get('http://127.0.0.1/')
if response1.status_code == 200:
print client_notify('r')
except (exceptions.ConnectionError, exceptions.HTTPError, exceptions.Timeout):
print client_notify('F')
break
requestCounter += 1
def main():
for cnum in range(connectionPerSec):
s1 = requests.session()
th = threading.Thread(
target=generate_req, args=(s1,),
name='thread-{:03d}'.format(cnum),
)
th.start()
for th in threading.enumerate():
if th != threading.current_thread():
th.join()
if __name__=='__main__':
main()
(1407275951.954147, 'thread-000', 'r')
(1407275951.95479, 'thread-001', 'r')