前言
本文将和大家一起探讨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
库提供了更多的线程监控功能,如线程执行时间、线程锁等。
这些方法可以根据需求选择合适的方式来监控线程的状态和数量。注意,在多线程编程中,由于线程之间的并发执行,可能会遇到线程安全的问题,因此在监控线程时需要注意线程同步和锁机制,以确保监控数据的准确性。