python:并发编程(二十五)

前言

本文将和大家一起探讨python并发编程的实际项目:win图形界面应用(篇七,共八篇),系列文章将会从零开始构建项目,并逐渐完善项目,最终将项目打造成适用于高并发场景的应用。

本文为python并发编程的第二十五篇,上一篇文章地址如下:

python:并发编程(二十四)_Lion King的博客-CSDN博客

下一篇文章地址如下:

python:并发编程(二十六)_Lion King的博客-CSDN博客

一、并发测试

1、观测pycharm线程数(粗略观测)

(1)在没有运行测试协议客户端时,线程数为70

(2)运行客户端的线程数为79

(3) 打开客户端,线程数为74

(4)增加连接,线程数为77

 (5)传输数据时,线程数为75

(6) 再次建立连接并发送数据,线程数为73

(7)将连续数量增加至10个,线程数量为72

 (8)为什么上述线程数不是呈线性变化?

一些可能影响线程数量变化的因素包括:

①Python解释器的线程池机制:Python解释器可能使用线程池来管理线程,因此在执行线程任务时可能会重用已有的线程,而不会每次都创建新线程。这样可以提高线程的效率,但可能导致线程数量不会严格线性增加。

②操作系统的线程调度:操作系统负责线程的调度和管理,它可能会对线程的创建和销毁进行优化和调整。操作系统可能会合并或重用一些线程资源,或者根据实际情况动态调整线程池的大小,以提高系统的整体性能。

③其他线程或进程的影响:系统中可能同时运行着其他线程或进程,它们也会占用一定的资源。这些线程或进程的存在可能会影响到线程数量的变化,使其不是严格线性的。

因此,在你的测试中,虽然你建立了多个TCP连接,但线程数量的变化可能受到上述因素的影响,导致结果不是严格线性的。这是正常现象,不必过于担心。最重要的是确保你的应用程序在运行时具有预期的功能和性能。

2、线程数量精准观测

(1)在接收数据的地方增加线程数量打印

print(threading.active_count())

 (2)观测到的数量变化

①建立TCP通信,并接受数据,此时的线程数为2,应该是主线程+1个TCP子线程

②后续每添加一个tab页,则新增加一个子线程,由此可见呈线性增加,也符合代码逻辑

这些数据说明我们的应用具备多线程并发的能力,目前实测至少支持10个客户端高并发,是能达到我目前的需求的。

二、测试小结

1、关于应用功能

应用有很多BUG与交互不友好的地方,如即使关闭tab页面无法关闭TCP连接,这些可能会影响调试,功能其实只有TCPclient,详细情况如下:

(1)选项卡功能

创建TCP客户端选项卡:通过点击"TCP Client"菜单项,可以在应用程序中创建一个TCP客户端选项卡,用于连接到服务器和发送/接收消息。

(2)在TCP客户端选项卡中,具体功能包括:

输入服务器IP地址和端口号。

点击"连接"按钮,连接到指定的服务器。

在发送消息输入框中输入消息,并点击"发送"按钮,将消息发送给服务器。

在接收消息区域中显示接收到的服务器消息。

(3)其他功能包括:

支持关闭选项卡,即关闭已连接的TCP客户端选项卡时会断开与服务器的连接。

2、关于线程监控

在Python中,可以使用以下几种方式来精准监控线程:

(1)使用threading模块:threading模块是Python内置的用于多线程编程的模块,通过使用Thread类创建线程对象,可以监控线程的状态和执行情况。可以使用is_alive()方法检查线程是否处于活动状态,使用join()方法等待线程执行结束。

(2)使用threading.active_count()函数:threading模块提供了active_count()函数,用于获取当前活动线程的数量。可以周期性地调用该函数来监控线程数量的变化。

(3)使用threading.enumerate()函数:threading模块的enumerate()函数可以返回当前活动的线程对象列表。通过比较前后两次调用的结果,可以判断线程是否增加或减少。

(4)使用threading._active字典:threading模块内部维护了一个_active字典,记录了当前活动的线程对象和其标识符。可以通过检查字典的长度来获取活动线程的数量。

(5)使用钩子函数:可以通过自定义钩子函数,在线程创建和结束时进行回调,并在回调函数中记录线程的状态和执行情况。

(6)使用第三方工具或库:还可以使用第三方工具或库来监控线程,例如psutil库可以获取系统的线程信息,threading_ex库提供了更多的线程监控功能,如线程执行时间、线程锁等。

这些方法可以根据需求选择合适的方式来监控线程的状态和数量。注意,在多线程编程中,由于线程之间的并发执行,可能会遇到线程安全的问题,因此在监控线程时需要注意线程同步和锁机制,以确保监控数据的准确性。


 

猜你喜欢

转载自blog.csdn.net/weixin_43431593/article/details/131364629