python多线程并发数量控制

python多线程并发数量控制,第1张

python多线程如果不进行并发数量控制,在启动线程数量多到一定程度后,会造成线程无法启动的错误。

控制多线程并发数量的方法有好几钟,下面介绍用queue控制多线程并发数量的方法。python3

python多线程延迟并发的解决方法如下:

1python之中多线程的特点,实际上是将执行耗时长的任务放在前台,耗时短的任务放在后台,当处理器有空闲时或者是后台任务主动调用时就会将其拿到前台来执行,而在这个过程之中实际上每次还是执行的一个线程。

2python多线程延迟并发指的则是当前python程序内有多个程序,也就是任务同时处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

3python多线程延迟并发的好处就在于可以更加合理的去调配资源,因为多线程是使用CPU的多核处理器去完成任务的。而并发则是在同一处理器上完成任务,多线程实现并发的话就可以提高运行速度并且减少内存占用。

python 37

Locust 111

MacOS

公司面对大量用户时,有时候需要对某些单接口/组合接口压测;但是单台机器的性能又无法满足大并发量,怎么办?一开始考虑用非界面版本的jmeter去执行任务,但是macOS对jmeter53不兼容(好卡,不知道是不是个人电脑问题),最后决定使用Python的高并发框架Locust。

下面说说当前接口并发工具中,各自的优缺点:

参数解释:

1使用@task装饰的方法为一个事务,方法的参数@task(2)用于指定该行为的执行权重,参数越大每次被用户执行的概率越高,默认为1(即task(2)是@task(1)执行次数的2倍)

2on_start():每个用户执行测试事务之前执行一次,用于做初始化的工作

命令窗口执行: locust -f 待测脚本

浏览器打开:locust:8089 # 8089是默认端口

执行方法比较简单,但务必注意⚠️Locust的版本主、从机是否一致

为了让代码能够并发执行,向创建线程并在核实的时候销毁它。

由于目的比较单纯,只是讲解基础的线程创建方法,所以可以直接使用threading库中的Thread类来实例化一个线程对象。

例子,用户输入两个数字,并且求其两个数字的四则运算的结果:

除了以上的一些功能以外,在python线程

中没有其他的诸如给线程发信号、设置线程调度属性、执行任何其他高级 *** 作的功能了,如果需要这些功能,就需要手工编写了。

另外,需要注意的是,由于GIL(全局解释器锁)的存在,限制了在python解释器当中只允许运行一个线程。基于这个原因,不停该使用python线程来处理计算密集型的任务,因为在这种任务重我们希望在多个CPU核心上实现并行处理。Python线程更适合于IO处理以及设计阻塞 *** 作的并发执行任务(即等待IO响应或等待数据库取出结果等)。

如何判断线程是否已经启动?

目的:我们加载了一个线程,但是想要知道这个线程什么时候才会开始运行?

方法:

线程的核心特征我认为就是不确定性,因为其什么时候开始运行,什么时候被打断,什么时候恢复执行,这不是程序员能够控制的,而是有系统调度

来完成的。如果遇到像某个线程的运行依托于其他某个线程运行到某个状态时该线程才能开始运行,那么这就是线程同步

问题,同样这个问题非常棘手。要解决这类问题我们要借助threading中的Event对象。

Event其实和条件标记类似,匀速线程

等待某个时间发生。初始状态时事件被设置成0。如果事件没有被设置而线程正在等待该事件,那么线程就会被阻塞,直到事件被设置位置,当有线程设置了这个事件之后,那么就会唤醒正在等待事件的线程,如果线程等待的事件已经设置了,那么线程会继续执行。

一个例子:

如上能够确定的是,主线程会在线程t运行结束时再运行。

Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序 *** 作系统进程的内部,但它们被协作式地调度。

遇到IO阻塞时会自动切换任务

上例geventsleep(2)模拟的是gevent可以识别的io阻塞,

而timesleep(2)或其他的阻塞,gevent是不能直接识别的需要用下面一行代码,打补丁,就可以识别了

from gevent import monkey;monkeypatch_all()必须放到被打补丁者的前面,如time,socket模块之前

我们可以用threadingcurrent_thread()getName()来查看每个g1和g2,查看的结果为DummyThread-n,即假线程

通过gevent实现单线程下的socket并发(from gevent import monkey;monkeypatch_all()一定要放到导入socket模块之前,否则gevent无法识别socket的阻塞)

服务端

客户端

多线程并发多个客户端

进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道(不推荐使用),这两种方式都是使用消息传递的

创建队列的类(底层就是以管道和锁定的方式实现)

参数介绍:

方法介绍:

主要方法:

其他方法(了解):

以上就是关于python多线程并发数量控制全部的内容,包括:python多线程并发数量控制、python多线程延迟并发、Locust高并发接口测试框架等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9811980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存