目录

  • 一、python线程模块的选择
  • 二、threading模块
  • 三、开启子线程的两种方式
    • 方式1:
    • 方式2
  • 四、join回收子线程
  • 五、Thread类的其他方法
  • 六、基于多线程实现socket多用户间通讯

一、python线程模块的选择

Python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。thread和threading模块允许程序员创建和管理线程。thread模块提供了基本的线程和锁的支持,threading提供了更高级别、功能更强的线程管理的功能。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。

避免使用thread模块,因为更高级别的threading模块更为先进,对线程的支持更为完善,而且使用thread模块里的属性有可能会与threading出现冲突;其次低级别的thread模块的同步原语很少(实际上只有一个),而threading模块则有很多;再者,thread模块中当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的清除工作,至少threading模块能确保重要的子线程退出后进程才退出

thread模块不支持守护线程,当主线程退出时,所有的子线程不论它们是否还在工作,都会被强行退出。而threading模块支持守护线程,守护线程一般是一个等待客户请求的服务器,如果没有客户提出请求它就在那等着,如果设定一个线程为守护线程,就表示这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。

二、threading模块

multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍(官方链接)

三、开启子线程的两种方式

线程的开启和进程不同,进程是拷贝一份代码去内存中执行。内部调用的是fork创建子进程

而线程是会去执行的指定函数

  1. 通过指定函数的方式
  2. 通过类的继承,实现run方法

方式1:

# 方式一
def task(name):print(f'{name} start')global xx -= 1print({name}, x)time.sleep(2)print(f'{name} end')if __name__ == '__main__':x = 10t1 = Thread(target=task,args=("线程1",))t2 = Thread(target=task,args=("线程2",))t1.start()  # 告诉操作系统开一个线程t2.start()  # 告诉操作系统开一个线程print('主')

线程1 start
{'线程1'} 9
线程2 start
{'线程2'} 8

线程1 end
线程2 end

方式2

# 方式二
class Mythread(Thread):def __init__(self,name):super().__init__()self.name = namedef run(self):print(f'{self.name} start')global xx -= 1print({self.name}, x)time.sleep(2)print(f'{self.name} end')if __name__ == '__main__':x = 10t1 = Mythread("线程1")t2 = Mythread("线程2")t1.start()t2.start()print('主')

线程1 start
{'线程1'} 9
线程2 start
{'线程2'} 8

线程1 end
线程2 end

通过上面两组代码你会发现:线程的创建运行比进程快,同一个进程中的线程可以共享资源

四、join回收子线程

和进程一样,等待所以子线程结束然后去回收

from threading import Thread
import time
'''
等待回收子线程
'''def task():print('子线程 start')time.sleep(2)print('子线程 end')t = Thread(target=task)
t.start()
t.join() # 等待子线程运行结束
print('主线程')

五、Thread类的其他方法

Thread实例对象的方法:

  • isAlive():返回线程是否活动的。
  • getName():返回线程名。
  • setName():设置线程名。

threading模块提供的一些方法:

  • threading.currentThread():返回当前的线程变量。
  • threading.enumerate():返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
from threading import Thread,currentThread,enumerate,activeCount
import time
'''
线程的其他用法:1.查看是否存在  is_alive()    # True or False2.获取线程名    getName()     3.设置线程名    setName(name) 4.当前线程      currentThread()   需要从threading导入currentThread模块5.活动线程总和  activeCount()     需要从threading导入activeCount模块6.查看所有线程  enumerate()       需要从threading导入enumerate模块
'''
def task():print('子线程 start')time.sleep(2)print('子线程 end')if __name__ == '__main__':t1 = Thread(target=task)t2 = Thread(target=task)t1.start()t2.start()print("查看线程状态,设置线程名,获取线程名","-" * 50)print(t1.is_alive())  # 查看是否存在print(t2.is_alive())  # 查看是否存在t1.setName("子线程一")  # 设置线程1名字t2.setName("子线程二")  # 设置线程2名字print(t1.getName()) # 获取线程名print(t2.getName()) # 获取线程名print("查看当前线程","-" * 50)print(currentThread())      # 查看当前线程print(currentThread().name)  # 查看当前线程名print("查看所有线程","-"*50)print(activeCount())    # 查看存活线程个数print(enumerate())  # 查看所有线程print(len(enumerate())) # 查看所有线程个数

六、基于多线程实现socket多用户间通讯

客户端

import socket
from threading import Threaddef task(conn,client_addr):# 通讯循环while 1:try:msg = conn.recv(1024)if not msg:breakprint(client_addr,"消息:",msg.decode("utf8"))msg = input("请输入内容")conn.send(msg.encode("utf8"))except Exception as e:print(e)breakif __name__ == '__main__':server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)server.bind(("127.0.0.1",8080))server.listen(5)# 链接循环while 1:print("等待连接...")conn, addr = server.accept()print(addr,"连接成功")t = Thread(target=task,args=(conn,addr))t.start()

客户端

import socketclient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8080))while 1:msg = input("请输入内容")client.send(msg.encode("utf8"))data = client.recv(1024)if not data:breakprint(data.decode("utf8"))

转载于:https://www.cnblogs.com/XuChengNotes/p/11552831.html

117 Python程序中的线程操作-开启多线程(threading.Thread)相关推荐

  1. Python程序中的线程操作-锁

    目录 一.同步锁 1.1 多个线程抢占资源的情况 1.1.1 对公共数据的操作 1.2 同步锁的引用 1.3 互斥锁与join的区别 二.死锁与递归锁 2.1 死锁 2.2 递归锁RLock 三.典型 ...

  2. python启动多个进程_Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

  3. 在python程序中的进程操作

    ********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...

  4. python在中小学教学中的应用-在python程序中的进程操作

    ********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...

  5. python进程线程处理模块_python程序中的线程操作 concurrent模块使用详解

    一.concurrent模块的介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecut ...

  6. python多线程为什么要用队列_Python程序中的线程操作-线程队列

    一.线程队列 queue队列:使用import queue,用法与进程Queue一样 queue is especially useful in threaded programming when i ...

  7. python中flush怎么用,在Python程序中操作文件之flush()方法的使用教程

    在Python程序中操作文件之flush()方法的使用教程 flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任 ...

  8. 在Python网络爬虫程序中使用线程池

    在Python网络爬虫程序中使用线程池 一.为什么需要使用线程池 二.线程池的使用 2.1 线程池的类与方法 2.2 使用线程池的一般步骤 三.在爬虫程序中使用线程池的实例 一.为什么需要使用线程池 ...

  9. 微课系列(7):Python程序中sys.argv的用法

    技术要点: 1)Python程序中如果使用到了sys.argv,这样的程序一般需要在命令提示符环境中运行,而不是在Python开发环境直接中运行. 2)sys.argv是个包含若干字符串的列表,其中s ...

  10. python如何在网络爬虫程序中使用多线程(threading.Thread)

    python如何在网络爬虫程序中使用多线程 一.多线程的基础知识 二.在网络爬虫中使用多线程 2.1 从单线程版本入手 2.2 将单线程版本改写为多线程版本 2.3 运行多线程版本程序 2.4 将多线 ...

最新文章

  1. linux 删除20日前数据,Linux 维护常用命令
  2. 【每周论文推荐】 初入深度学习CV领域必读的几篇文章
  3. php odbc连接数据库命名实例,一个用mysql_odbc和php写的serach数据库程序_php实例
  4. [APIO2013]机器人(DP+SPFA最短路)
  5. Servlet---注解开发
  6. 现代计算机教室布置图片,高中教室布置设计图
  7. 前端学习(707):循环小结
  8. 实战,实现幂等的8种方案!
  9. 在数据库系统中遇见存储技术飞跃会怎样?
  10. bzoj1024 [SCOI2009]生日快乐 结论+dfs
  11. Python OS使用
  12. 高级API 快速入门之第八章 多线程02
  13. 基于SSM+Eclipse+MySQL的学生宿舍管理系统(SSM毕业设计源码)(学生宿舍管理系统毕业设计)
  14. 汤家凤:九月前强化复习结束不了怎么办?
  15. 正交试验minitab
  16. 【EXLIBRIS】#小词旮旯# 001 Lock
  17. 狂神说Java之Springboot整合Shiro
  18. Linux基础8-TCP的面向链接(三次四次)
  19. 数据标注是什么,如何高效完成数据标注?
  20. poi处理word内容的公式_Java 使用 POI 操作 XWPFDocument 中的 XWPFParagraph(段落)对象的属性略解 Wor - 链滴...

热门文章

  1. mysql 连接 互联网_互联网技术分享社区 MySQL字符串连接函数
  2. oracle怎么同步时间设置,【oracle数据库获取当前时间】
  3. 动态规划之LIS(最长上升子序列)
  4. 前端jquery学习
  5. eclipse、EditPlus等编辑器选中列(块)的方法
  6. 利用后中遍历结果,重构二叉树
  7. canvas arc() 方法绘制弧线、曲线、圆形,rect() 绘制矩形
  8. vue 实现截图并获取截图的坐标_超好用的“电影截图”获取方式
  9. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_3_Junit_使用步骤...
  10. 截取一段字符串中,两个指定字符串中间的字符串