threadpool

软件测试技术进阶篇——花椒测试平台

孤街浪徒 提交于 2020-08-08 08:59:08
软件测试,爱码小哥邀你同行! 1. 背景 先来说说花椒测试平台的由来: # 目的1,降低接口测试对测试人员代码能力的要求。测试人员只需要知道接口的url,请求参数,以什么样的格式传个服务端,接口的响应数据里需要验证哪个字段的值即可进行测试,而不需要知道怎么建一个工程,怎么建一个测试类,测试方法,testng是怎么使用的,结果怎么解析,怎么取到想要的字段去做判断。 # 目的2,可视化的case管理,执行,结果管理。打开一个浏览器,根据接口文档新建一个测试case,执行检查接口返回,保存case,建不同入参的该接口的case,组成case集,批量运行,查看运行结果,相比于工程执行批量case,testng的html结果,平台的集中展示更清晰。 # 既然接口的测试已经有case的信息了,对接口进行压测的请求其实也类似一个case,只不过是有很多人在同时执行这个case,所以有了压力测试和接口测试平台的整合。在平台建压测任务的时候选定一个测试用例为载体,多并发的执行case,统计压测数据,实时展示。以往接口测试和压力测试都是分别写一个方法,里面有很多重复的部分。 # 接下来我们会想,像接口测试是由数据驱动的,那么UI自动化是否可以理解为一种另类的驱动呢?UI操作的公共方法如点击,输入,检查元素的值,其实和接口入参和结果检查很像,基于cucumber我们将UI自动化集成进了测试平台

c# Blocking Collection and Threading

Deadly 提交于 2020-08-08 05:44:08
问题 I'm new to using Blocking Collection and threading and want to make sure I'm following best practice. I'm using a third party API that is not thread safe. I will be making multiple simultaneous requests to the API, so I need to add these requests to a queue and process them one after another. To do this I have a blocking collection: BlockingCollection<myEventArgs> myTasks = new BlockingCollection<myEventArgs>(); private void myEventHandler(object sender, myEventArgs e) { myTasks.Add(e); }

Java并发基础

[亡魂溺海] 提交于 2020-08-04 19:50:51
文章目录 1.Volatile 2.CAS 3.锁 4.AQS 5.ThreadPool 1.Volatile volatile是一个关键字,用于在并发编程中修饰变量 volatile:java提供的一种 弱 同步机制 轻量的同步机制,用来确保将变量的更新通知到其他线程 保证可见性(禁止指令重排)、不保证原子性 如何保证可见性 变量声明为volatile类型后,编译器与运行时都会注意到这个变量时共享的,不会将该变量 上的操作和其他内存操作仪器重排序 volatile变量不会被缓存在寄存器 指令重排 多线程环境中,线程交替运行,编译器优化重排的存在,两个线程中使用的变量无法保持一致性 JMM(Java内存模型) JMM描述的是一组规范,通过规范来定义程序中各个变量的访问方式 jmm同步规定: 1.线程解锁前,必须把共享变量的值刷新回主内存 2.线程加锁前,必须读取主内存的最新值到自己的工作内存 3.加锁解锁是同一把锁 不保证原子性 原子性:不可分割、完整性,即某个线程正在做某个具体业务,中间不可以被加塞或者被分割,需要整体完整, 要么同时成功,要么同时失败 使用AtomicInteger,synchronized 可以保证原子性 2.CAS CompareAndSet-- 比较并设置(交换) CAS是一条CPU并发原语,体现在sun.misc.Unsafe类中各个方法 public

C#线程池

这一生的挚爱 提交于 2020-08-04 18:27:53
class Program { // 使用BeginXXX/EndXXX和IAsyncResult对象的方式被称为异步编程模型(APM模式) delegate string RunOnThreadPool(out int threadId); static void Main(string[] args) { int threadId = 0; // 给委托变量赋值 RunOnThreadPool poolDelegate = Test; var t = new Thread(() => { Test(out threadId); }); t.Start(); t.Join(); Console.WriteLine($"1.返回的线程Id:{threadId}"); // 通过调用委托变量的BeginInvoke方法来运行委托(执行Test方法) IAsyncResult ar = poolDelegate.BeginInvoke(out threadId, Callback, "异步委托调用"); ar.AsyncWaitHandle.WaitOne(); // 调用委托的EndInvoke会等待异步操作(Test方法)完成 // 异步操作执行完成之后,开始执行回掉函数;异步操作和回掉函数很可能会被线程池中同一个工作线程执行 string result =

Connection pool is full, discarding connection with ThreadPoolExecutor and multiple headless browsers through Selenium and Python

时光毁灭记忆、已成空白 提交于 2020-07-30 07:28:06
问题 I'm writing some automation software using selenium==3.141.0 , python 3.6.7 , chromedriver 2.44 . Most of the the logic is ok to be executed by the single browser instance, but for some part i have to launch 10-20 instances to have a decent execution speed. Once it comes to the part which is executed by ThreadPoolExecutor , browser interactions start throwing this error: WARNING|05/Dec/2018 17:33:11|connectionpool|_put_conn|274|Connection pool is full, discarding connection: 127.0.0.1 WARNING

C#中你想象的Task,很简单?

做~自己de王妃 提交于 2020-07-29 00:49:26
【导读】 网上关于Task的文章如数家珍,不过有一部分并未谈到一个根本的问题,所创建的Task一定在线程池上运行?如何合理的使用Task? 这里并不会去重新讲解每一个APi的使用,没有任何意义,这属于包括我在内的各位童鞋们都必须要了解的基础前提。这里我对其作出基本总结以及使用Task时需要注意的地方 Thread与Task区别 任务可以返回结果 , 没 有直接的机制可以从 线程返回结果。 任务通过使用取消令牌来支持取消, 但是线程没有。 一个任务可以同时执行多个线程, 线程一次只能运行一个任务。 可以使用async和await关键字轻松实现异步。 新的Thread不处理线程池线程,而Task确实使用线程池线程。 任务是比线程更高层次的概念。 Task .NET框架提供Threading.Tasks类,我们可以创建任务并异步运行它们,任务是代表应该完成的某些工作的对象。该任务可以告诉我们工作是否完成,并且操作返回结果,那么任务将为我们提供结果。 深入思考Task Thread是基于操作系统级别的线程,而ThreadPool和Task不会创建自己的操作系统线程,二者是由任务调度器(TaskScheduler)执行,默认的调度程序仅仅在ThreadPool上运行,与ThreadPool不同,Task可以在指定时间返回完成结果,并且还可以通过ContinueWith延续任务

QuartzSchedulerThread 调度分析

寵の児 提交于 2020-07-28 05:21:40
1 Quartz 线程 Quartz 有两类线程,调度线程(红) 和 执行线程(绿),如图: 2 QuartzSchedulerThread 分析 QuartzSchedulerThread 为Quartz核心线程,负责任务的调度,读取用户设定的触发器并分配线程,使触发器能够按照预定时间执行。 2.1 执行步骤说明 循环判断调度是否应该停止,如果应该停止则清空资源结束调度 循环判断调度是否应该暂停,如果应该暂停则,则调用wait阻塞本线程,直到被外部唤醒 (被唤醒后)从线程池中查询可用的任务执行线程,若线程池中暂无可用线程,则阻塞本线程,直到获取至少一个可用线程 根据一定规则从任务存储区域(JobStore)中找出马上要执行的一批触发器 配置参数 idleWaitTime,默认为30000,即在当前时间后 30s 内即将被触发执行的触发器就会被取出 配置参数 misfireThreshold,默认为60000,即在当前时间的 60s 之前本应执行但尚未执行的触发器不被认为是延迟触发,也会取出。更早之前的由 MisfireHandlerThread 按 Misfire 策略处理。 配置参数 batchTriggerAcquisitionMaxCount,默认为1,即一次拉取的批次数量为【 Math.min(该值, 可用线程数) = 1】 当该值大于1时,在集群环境下,需确保

How to create a dedicated threadpool for CPU-intensive work in Tokio?

馋奶兔 提交于 2020-07-28 04:20:09
问题 I have a Rust async server based on the Tokio runtime. It has to process a mix of latency-sensitive I/O-bound requests, and heavy CPU-bound requests. I don't want to let the CPU-bound tasks monopolize the Tokio runtime and starve the I/O bound tasks, so I'd like to offload the CPU-bound tasks to a dedicated, isolated threadpool (isolation is the key here, so spawn_blocking / block_in_place on one shared threadpool are insufficient). How can I create such a threadpool in Tokio? A naive

How to create a dedicated threadpool for CPU-intensive work in Tokio?

蓝咒 提交于 2020-07-28 04:20:09
问题 I have a Rust async server based on the Tokio runtime. It has to process a mix of latency-sensitive I/O-bound requests, and heavy CPU-bound requests. I don't want to let the CPU-bound tasks monopolize the Tokio runtime and starve the I/O bound tasks, so I'd like to offload the CPU-bound tasks to a dedicated, isolated threadpool (isolation is the key here, so spawn_blocking / block_in_place on one shared threadpool are insufficient). How can I create such a threadpool in Tokio? A naive

在Spring项目中以多线程的方式并发执行,异步处理任务。解决统计、累加类业务的例子。

陌路散爱 提交于 2020-07-27 23:05:34
业务描述: 其实具体业务无所谓,这次解决的问题是“ 统计、累加类业务类型 ”,这里的业务就用”统计动物园中所有种类动物数量的总和”,类比代替了。 我要写一个接口,吐出 “动物园所有种类动物的总和”。已知目前有 15种动物,现在有现成的查询每种动物数量的接口,每种动物都要调用RPC接口去别的系统查询。且耗时较高。 工作方案: 根据上面的描述,线性去查询,调用15次RPC接口,时间花费巨大,所以放弃单线程模式。打算使用多线程的方法,进来请求后,分发 15个线程去查每一种动物的数据,返回结果。用多线程的话,在项目中肯定首先考虑使用线程池。 具体实现 (线程池 + 线程 + CountDownLatch ): 1、配置线程池 <bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心线程数 --> <property name="corePoolSize" value="15" /> <!-- 最大线程数 --> <property name="maxPoolSize" value="30" /> <!-- 队列最大长度 >=mainExecutor.maxSize --> <property name="queueCapacity"