我想在我们的其中一台Web服务器上进行一些性能测试,以了解服务器如何处理大量持久连接。不幸的是,我对HTTP和Web测试不是很熟悉。这是到目前为止我已经获得的Python代码:
import http.client
import argparse
import threading
def make_http_connection():
conn = http.client.HTTPConnection(options.server, timeout=30)
conn.connect()
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("num", type=int, help="Number of connections to make (integer)")
parser.add_argument("server", type=str, help="Server and port to connect to. Do not prepend \'http://\' for this")
options = parser.parse_args()
for n in range(options.num):
connThread = threading.Thread(target = make_http_connection, args = ())
connThread.daemon = True
connThread.start()
while True:
try:
pass
except KeyboardInterrupt:
break
我的主要问题是: 如何保持这些连接的生命?
我设置了很长的超时时间,但这是一种非常粗糙的方法,我甚至不确定它是否会影响连接。是否只是偶尔偶尔请求一两个字节?
(此外,与while True:
我代码末尾的丑陋块相比,还有一个更好的过程来等待键盘中断吗?)
urllib.request
不支持持久连接。'Connection: close'
代码中有硬编码。但http.client
部分支持持久连接(包括旧版http / 1.0 keep- alive
)。因此,问题标题可能会引起误解。
我想在我们的其中一台Web服务器上进行一些性能测试,以了解服务器如何处理大量持久连接。不幸的是,我对HTTP和Web测试不是很熟悉。
您可以使用现有的http测试工具(例如slowloris和httperf)来代替自己编写。
如何使这些连接保持活动状态?
要关闭http / 1.1连接,客户端应明确指定Connection: close
标头,否则服务器会认为该连接是持久的(尽管它可能随时关闭它,直到它尝试读取/写入连接时才http.client
知道该连接)。
conn.connect()
几乎立即返回,并且线程结束。要强制每个线程维护与服务器的http连接,您可以:
import time
def make_http_connection(*args, **kwargs):
while True: # make new http connections
h = http.client.HTTPConnection(*args, **kwargs)
while True: # make multiple requests using a single connection
try:
h.request('GET', '/') # send request; make conn. on the first run
response = h.getresponse()
while True: # read response slooowly
b = response.read(1) # read 1 byte
if not b:
break
time.sleep(60) # wait a minute before reading next byte
#note: the whole minute might pass before we notice that
# the server has closed the connection already
except Exception:
break # make new connection on any error
注意:如果服务器返回,'Connection: close'
则每个连接只有一个请求。
(另外,一个无关紧要的问题是,比我的代码末尾的丑陋的True:block更好的等待键盘中断的程序吗?)
要等待所有线程完成或KeyboardInterrupt
发生,您可以:
while threads:
try:
for t in threads[:]: # enumerate threads
t.join(.1) # timeout 0.1 seconds
if not t.is_alive():
threads.remove(t)
except KeyboardInterrupt:
break
或类似这样的东西:
while threading.active_count() > 1:
try:
main_thread = threading.current_thread()
for t in threading.enumerate(): # enumerate all alive threads
if t is not main_thread:
t.join(.1)
except KeyboardInterrupt:
break
后者可能由于各种原因而无法工作,例如,如果存在虚拟线程,例如以C扩展名启动的线程而不使用threading
模块。
parallel.futures.ThreadPoolExecutor提供了比threading
模块更高的抽象级别,并且可以隐藏一些复杂性。
您可以在单个线程中同时打开多个连接,而不是使用每个连接模型的线程,例如,使用requests.async
或gevent
直接打开。
问题内容: 我正在尝试Go-并希望创建一个可以远程登录,发送命令和接收响应的TCP服务器。 上面的代码片段每次都会关闭连接,将我踢出终端会话。但是我真正想要的是能够保持连接打开以进行更多的I / O操作。如果我只是删除,则服务器似乎挂在某处,因为它不再获得任何响应。 我解决此问题的方法是让我的handleRequest方法无休止地循环,以便它在收到消息之前永远不会退出。这是否合适- 还是有更好的实
问题内容: 我有一个使用JDBC连接到MySQL的应用程序。在某些情况下,JDBC连接空闲数小时(甚至几天),并且失去与MySQL的连接,然后尝试执行查询时除外。最好的解决方案是什么? 问题答案: 保持连接打开时间不足是一个坏习惯。当数据库打开时间过长时,它将强制关闭。您应该编写JDBC代码,以便它总是在您获取它们的同一块块中关闭连接(以及语句和结果集),以防止这样的资源泄漏。 但是,获取每个连接
我目前正在开发一个支持保活连接的多线程代理服务器。在处理来自火狐浏览器的请求时,我看到了一些奇怪的问题。我使用localhost:10001/http://url连接到我的本地代理,我可以访问这个主机上的所有链接。过程如下。1.创建一个套接字,将其绑定到端口10001 2.接受连接,如果客户端连接了fork()3.继续将客户端请求处理为持久连接。 现在的问题是,当我在Firefox中打开一个新选项
所以,我尝试使用套接字和Ruby来模拟一些基本的HTTP持久性连接——用于大学课堂。 关键是构建一个服务器——能够处理多个客户端——接收文件路径并返回文件内容——就像HTTP GET一样。 当前服务器实现循环监听客户端,当有传入连接时触发新线程,并从该套接字读取文件路径。它非常笨,但是在处理非持久连接时工作良好——每个连接一个请求。 但它们应该坚持不懈。 这意味着客户端不必担心关闭连接。在非持久版
英文原文:http://emberjs.com/guides/models/connecting-to-an-http-server/ 如果Ember应用需要从HTTP服务器加载JSON数据,本指南将介绍如何配置Ember Data来从服务器端加载记录,不论服务器返回的数据格式是什么样子。 仓库使用了一个称为适配器,知道如何通过网络进行通信的对象。默认情况下,仓库会使用DS.RESTAdapter
我能知道Hazelcast支持磁盘持久性吗?换句话说,我可以使用Hazelcast作为常规数据库吗?(就像apache点火一样)。