-
2021-02-04 04:47:32
我正在开发一个Python后端web服务器,它从付费的第三方API获取实时数据。
我需要查询这个API非常快(大约每10秒150个查询)。因此,我创建了一个小的概念证明,生成200个线程并将url写入队列。然后,线程从队列中读取url并发送HTTP请求。第三方API返回一个名为delay的值,即服务器处理请求所用的时间。
下面是POC代码,它只下载所有url(而不是重复)。在_http_pool = urllib3.PoolManager()
def getPooledResponse(url):
return _http_pool.request("GET", url, timeout=30)
class POC:
_worker_threads = []
WORKER_THREAD_COUNT = 200
q = Queue.Queue()
@staticmethod
def worker():
while True:
url = POC.q.get()
t0 = datetime.datetime.now()
r = getPooledResponse(item)
print "thread %s took %d seconds to process the url (service delay %d)" % (threading.currentThread().ident, (datetime.datetime.now() - t0).seconds, getDelayFromResponse(r))
POC.q.task_done()
@staticmethod
def run():
# start the threads if we have less than the desired amount
if len(POC._worker_threads) < POC.WORKER_THREAD_COUNT:
for i in range(POC.WORKER_THREAD_COUNT - len(POC._worker_threads)):
t = threading.Thread(target=POC.worker)
t.daemon = True
t.start()
POC._worker_threads.append(t)
# put the urls in the queue
for url in urls:
POC.q.put(url)
# sleep for just a bit so that the requests don't get sent out together (this is a limitation of the API I am using)
time.sleep(0.3)
POC.run()
当我运行这个程序时,前几个结果会以合理的延迟返回:
^{pr2}$
然而,大约10-20秒后,我得到了这些东西:thread 140548049958656 took 23 seconds to process the url (service delay 1.754)
换句话说,即使服务器返回时延迟很小,我的线程也需要更长时间才能完成。。。在
我该如何测试其他21秒的跑步时间?在
谢谢!在
更多相关内容 -
java模拟多线程http请求代码分享
2021-03-15 17:30:35java模拟多线程http请求代码分享发布于 2020-12-12|复制链接本篇文章给大家分享了java模拟多线程http请求的相关实例代码,对此有需要的可以跟着测试下。java模拟http发送请求,第一种是HttpURLConnection发送post...java模拟多线程http请求代码分享
发布于 2020-12-12|
复制链接
本篇文章给大家分享了java模拟多线程http请求的相关实例代码,对此有需要的可以跟着测试下。
java模拟http发送请求,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求,实例代码:
```java
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**java 模拟测试多线程测试http请求
* @author wdh
*
*/
public class ServiceThreadTest implements Runnable{
private String url;
private Map paramStr;
public ServiceThreadTest(String url, Map paramStr) {
super();
this.url = url;
this.paramStr = paramStr;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map getParamStr() {
return paramStr;
}
public void setParamStr(Map paramStr) {
this.paramStr = paramStr;
}
@Override
public void run() {
// http请求实现方式
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost post = new HttpPost(url);
RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(10000).setConnectTimeout(10000)
.setSocketTimeout(10000).build();
CloseableHttpResponse response = null;
try {
List params = setHttpNameValues(paramStr);
HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");
post.setEntity(httpentity);
post.setConfig(config);
response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
System.out.println("content:" + content);
} catch (Exception e) {
e.printStackTrace();
}
}
private List setHttpNameValues(Map paramMap) {
List params = new ArrayList();
for (Entry entry:paramMap.entrySet()){
params.add(new BasicNameValuePair(entry.getKey(),entry.getValue().toString()));
}
return params;
}
public static void main(String[] args) {
//运用java工具类中线程池
ExecutorService pool = Executors.newCachedThreadPool();
for (int i =0;i paramStr = getHttpParamStr();
pool.execute(new ServiceThreadTest(url,paramStr));
}
}
public static Map getHttpParamStr() {
Map param = new HashMap();
param.put("apiversion", 1);
param.put("appversion", "3.6.2");
return param;
}
}
```
-
python多线程实现http请求
2020-12-29 02:29:56-*- coding: utf-8 -*-import threading, datetime, time, httplib# 初始最大并发数START_THEAD_COUNT = 200# 递增并发数THREAD_INCREASE_STEP = 10# 域名DOMAIN = 'www.baidu.com'# 默认http请求METHOD = ...#!/usr/bin python2.6
# -*- coding: utf-8 -*-
import threading, datetime, time, httplib
# 初始最大并发数
START_THEAD_COUNT = 200
# 递增并发数
THREAD_INCREASE_STEP = 10
# 域名
DOMAIN = 'www.baidu.com'
# 默认http请求
METHOD = 'get'
# 默认访问的web路径
PATH = '/'
# 请求发送间隔 整数
INTERVAL = 5 # 5秒
'''Factory'''
class biz :
'''Main'''
def run(self) :
start = datetime.datetime.now()
global FAILED_COUNT
FAILED_COUNT = 0
threads = []
# thread instance initialization
for i in range(START_THEAD_COUNT) :
t=threading.Thread(target=self.execute, args=())
threads.append(t)
# activate threads
for i in range(START_THEAD_COUNT) :
threads[i].start()
# wait for all ends
for i in range(START_THEAD_COUNT) :
threads[i].join()
delta = datetime.datetime.now() - start
writeline('INFO', 'Total is \'' + str(START_THEAD_COUNT) + '\' while failed \'' + str(FAILED_COUNT) + '\' in ' + str(delta.seconds) + str(delta.microseconds / 1000) + 'ms.')
return (True, None)
'''Execute http request and get response status'''
def execute(self) :
global FAILED_COUNT
conn = httplib.HTTPConnection(DOMAIN)
conn.request(METHOD, PATH)
r = conn.getresponse()
if r.status not in (200, 302) : FAILED_COUNT = FAILED_COUNT + 1
conn.close()
return (True, None)
'''Log writer'''
def writeline(status, msg) :
line = time.strftime('%Y-%m-%d %X', time.localtime(time.time())) + ' [' + status + '] ' + msg
print line
return (True, line)
if __name__ == '__main__' :
o = biz()
while True :
r, c = o.run()
if not r : writeline('FAILED-', c)
time.sleep(INTERVAL)
# update max threads
START_THEAD_COUNT = START_THEAD_COUNT + THREAD_INCREASE_STEP
-
C#(Csharp)多线程HTTP并发请求(HttpWebRequest)采集蜘蛛
2012-12-30 12:38:02C#(也称Csharp)在多线程下并发执行HTTP请求的实现,采用C#封装HttpWebRequest类开发的多线程并发采集程序源码文档,文档中详细说明了HttpWebRequest并发HTTP请求实现网站采集的方法,经过测试同时并发1000+不是问题... -
java模拟多线程http请求
2018-10-10 15:21:57/**java 模拟测试多线程测试http请求 * @author wdh * */ public class ServiceThreadTest implements Runnable{ private String url; private Map,Object> paramStr; public ServiceThreadTest...package test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; /**java 模拟测试多线程测试http请求 * @author wdh * */ public class ServiceThreadTest implements Runnable{ private String url; private Map<String,Object> paramStr; public ServiceThreadTest(String url, Map<String,Object> paramStr) { super(); this.url = url; this.paramStr = paramStr; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Map<String,Object> getParamStr() { return paramStr; } public void setParamStr(Map<String,Object> paramStr) { this.paramStr = paramStr; } @Override public void run() { // http请求实现方式 CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost post = new HttpPost(url); RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(10000).setConnectTimeout(10000) .setSocketTimeout(10000).build(); CloseableHttpResponse response = null; try { List<NameValuePair> params = setHttpNameValues(paramStr); HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8"); post.setEntity(httpentity); post.setConfig(config); response = httpClient.execute(post); HttpEntity entity = response.getEntity(); String content = EntityUtils.toString(entity); System.out.println("content:" + content); } catch (Exception e) { e.printStackTrace(); } } private List<NameValuePair> setHttpNameValues(Map<String,Object> paramMap) { List<NameValuePair> params = new ArrayList<NameValuePair>(); for (Entry<String, Object> entry:paramMap.entrySet()){ params.add(new BasicNameValuePair(entry.getKey(),entry.getValue().toString())); } return params; } public static void main(String[] args) { //运用java工具类中线程池 ExecutorService pool = Executors.newCachedThreadPool(); for (int i =0;i<2;i++) { //开启俩个线程 String url = "xxxx"; Map<String,Object> paramStr = getHttpParamStr(); pool.execute(new ServiceThreadTest(url,paramStr)); } } public static Map<String,Object> getHttpParamStr() { Map<String, Object> param = new HashMap<String, Object>(); param.put("apiversion", 1); param.put("appversion", "3.6.2"); return param; } }
-
通过HTTP多线程并发post/get数据
2013-09-27 11:35:30编译工具:VC++6.0 通过http进行多线程并发post/get数据从服务器上,并将数据显示在界面上。 -
python伪造IP多线程发送http请求
2013-11-22 18:10:16注,需要安全scapy 在centos下,请执行以下脚本安装scapy #!/usr/bin sh cd /tmp wget scapy.net unzip scapy-latest.zip cd scapy-2.* python setup.py install 需要手工启动和杀线程关闭 经测python2可用 -
多线程处理多次Http请求慢的问题
2020-06-17 13:44:22业务场景:前端调Java接口,接口需要多次请求http请求,因为是顺序执行,每个http耗时很长,大概5秒左右,但是叠加起来是很恐怖的,有必要做成多线程去处理。 大体思路:多线程去do任务,使用CountDownLatch进行... -
python 多线程对post请求服务器测试并发的方法
2020-09-19 07:39:13今天小编就为大家分享一篇python 多线程对post请求服务器测试并发的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
SpringBoot多线程进行异步请求的处理
2020-01-17 06:27:03有人发布了博客,系统进行查重的时候需要十秒左右时间才能处理完,由于一开始是单例模式,导致,在某人查重的时候整个系统是不会再响应别的请求的,导致了系统假死状态,那么我们就应该使用多线程进行处理,将这种不... -
JavaWeb_多个HTTP请求同时访问怎么处理?
2021-03-08 19:49:26Servlet对并发的处理Tomcat容器处理多并发采用单例模式、多线程处理方式只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,servlet在其生命周期中只有在将项目给移除或服务器stop的时候才会... -
易语言-多线程HTTP代理POST、GET提交
2021-06-26 08:38:47多线程HTTP代理POST、GET提交源码 -
QT实现HTTP JSON高效多线程处理服务器
2017-01-09 16:26:15QT实现HTTP JSON高效多线程处理服务器,解决几个问题: 1. 框架的业务实现部分必须最够简单,业务部分容易实现和扩充; 2. 高效多线程并发处理必须最够强; 3. 体量小,CPU、内存占用小,能够长时间稳定运行; -
java多线程请求同一接口,模拟高并发
2019-10-15 14:49:041、多线程工具TreadTestHttp package com; import java.util.concurrent.CountDownLatch; public class TreadTestHttp { public static void main(String[] args) throws InterruptedException { Runn... -
android实现多线程下载文件(支持暂停、取消、断点续传)
2021-01-05 12:24:19多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可。... -
C#多线程处理实现post并发请求
2018-03-01 08:06:28需求是这样:如从文件中读取了10条数据,将数据参数循环给post请求,然后分别记录每个请求所用时间,最后记录平均请求时间,希望能从原有代码上使用多线程处理。请求和响应。 原有代码: //读取excel ds = ... -
qt 线程池实现多线程下载
2017-08-31 19:24:52使用qt线程池实现多线程http请求,支持限速下载,可以设置全部下载的网络上限,和单个线程的网络上限。可以实时显示当前下载速度。 -
关于多线程发送请求并发的一些问题。
2015-08-14 04:18:40最近做android,有一个问题一直...服务器怎么一下子处理这些请求,而服务器如果是多线程处理完这些请求返回到客户 端时,客户端怎么知道这些返回信息是返回给哪个客户端线程的,毕竟它们SessionId和请求 地址是一样的? -
curl多线程批量请求
2018-11-20 17:31:57可以自定义线程数进行跑,细节不多说,其实我也是上网上凑的,拿下来修修改改能用即可。 #!/bin/bash ttime=`date +"%Y-%m-%d %H:%M:%S"` #允许的线程数 THREAD_NUM=5 #定义描述符为9的管道 mkfifo tmp ... -
多线程应用(一)—Http请求阻塞回调处理
2017-11-13 16:48:28多线程应用(一)—Http请求阻塞回调处理1.需求描述1.1场景说明:由于,微信端的业务需求量越来越大.将业务与微信第三方事件处理耦合在一起的单一项目的结构已经逐渐暴露出,承载能力不足的缺点.所以,需要将与微信的交互... -
Qt 之 HTTP 请求 多线程分块下载——上(获取下载文件大小)
2016-11-14 18:30:42简述在 Qt 之 HTTP 请求下载(支持断点续传) 文章中我们使用Qt 的方法进行HTTP 请求下载文件,同时能够断点续传,本篇文章是这一篇文章的续篇。我们一般在网上下载软件、电影、文件等,大都是使用迅雷下载,因为... -
Web项目高并发多请求的实现原理,采用多线程or多进程?
2019-11-06 09:54:08django自带Gateway组件(类似Gunicorn 或者 uWSGI)实现并发处理多请求,runserver 默认是单进程多线程。 django-admin and manage.py:The development server is multithreaded by default. Use the --noth... -
深入理解tomcat是怎样多线程处理http请求并将代码执行到controller里的
2017-11-16 20:58:11彻底理解tomcat是怎样多线程处理的http请求并将代码执行到controller里的 1.线程池:thread=threadPool.getThread().thread.executeHttp(httprequest),thread的start方法执行行里面调用,每个thread里获取所有的... -
python爬虫之多线程、多进程爬虫
2019-05-09 17:22:00多线程对爬虫的效率提高是非凡的,当我们使用python的多线程有几点是需要我们知道的: 1.Python的多线程并不如java的多线程,其差异在于当python解释器开始执行任务时,受制于GIL(全局解释所),Python 的线程被限制... -
模拟高并发的测试(多线程开启httpclient请求接口)
2018-12-28 14:50:12模拟高并发的原理就是:利用线程池去执行多个线程通过httpclient访问controller package com.xtzn.utils; import com.alibaba.fastjson.JSONObject; import org.apache.http.client.config.RequestConfig; ... -
实现PHP多线程异步请求的3种方法
2016-03-04 10:01:52CURL扩展是我们在开发过程中最常用的一种方法,他是一个强大的HTTP命令行工具,可以模拟POST/GET等HTTP请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。 $cl = curl_init(); $curl_opt = array... -
封装httpClient工具类进行get、post、put、delete的http接口请求,可添加请求头与参数,支持多线程
2021-01-06 21:21:50//多线程调用注意配置,根据线程数设定 cm.setDefaultMaxPerRoute(300); requestConfig = RequestConfig.custom() //数据传输过程中数据包之间间隔的最大时间 .setSocketTimeout(20000) //连接建立时间,三次握手... -
flask是如何处理多个访问请求的?
2020-12-20 02:22:39假设服务器跑着这样一段简单的flask代码:app = Flask()@app.route('/')def index():return ...请问flask是如何同时处理这两个请求的 ? 如果我的代码没有实现任何并发功能,flask会自动帮我处理并发请求吗 ? 如果有... -
HttpClient4.x 多线程请求
2015-03-13 15:24:42基本过程:使用httpclient发起多线程的请求,将返回的数据临时放在ArrayBlockingQueue中,单独开启一个线程读取ArrayBlockingQueue中的数据并写入磁盘上的文件。 启动请求线程 import java.util.concurrent....