创建多线程之threading.Thread的使用
1.threading模块
threading模块是众多多线程管理模块的其一,它能确保重要的子线程退出后进程才退出。
multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍
2.创建线程的两种方式
方式一:
from threading import Thread
import time
# 进程等待所有线程结束后才会结束
def func():
print('线程 start')
time.sleep(2)
print('线程 end')
if __name__ == '__main__':
t = Thread(target=func)
t.start() # 告诉操作系统开一个线程
print('主')
方式二:
from threading import Thread
import time
class Myt(Thread):
def run(self):
print('子线程 start')
time.sleep(2)
print('子线程 end')
t = Myt()
t.start()
print('主线程'
3.子进程和子线程pid的比较
from threading import Thread
from multiprocessing import Process
import os
def func():
print('hello',os.getpid())
if __name__ == '__main__':
# 在主进程开启多个线程,每个线程都跟主进程pid一样
t1 = Thread(target=func)
t2 = Thread(target=func)
t1.start()
t2.start()
print('主线程/主进程pid:',os.getpid())
# 开个多个子进程,每个进程都有不同的pid:
p1 = Process(target=func)
p2 = Process(target=func)
p1.start()
p2.start()
print('主线程/主进程pid:', os.getpid())
4.子线程内存数据共享问题
from threading import Thread
from multiprocessing import Process
def func():
global n
n = 0
if __name__ == '__main__':
# 子进程:
n = 100
p = Process(target=func)
p.start()
p.join()
print('主',n) # 毫无疑问子进程p已经将自己的n改成了全局的n,改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100
# 子线程:
n = 1
t=Thread(target=func)
t.start()
t.join()
print('主',n) # 查看结果为,因为同一进程内的线程之间共享进程内的数据
5.线程的join方法
from threading import Thread
import time
def func(name,n):
print(f'{name} start')
time.sleep(n)
print(f'{name} end')
t1 =Thread(target=func,args=('线程1',1))
t2 =Thread(target=func,args=('线程2',2))
t3 =Thread(target=func,args=('线程3',3 ))
start = time.time()
t1.start()
t2.start()
t3.start()
t1.join() # 等待子线程运行结束
t2.join()
t3.join()
end = time.time() #
print(end-start) # 3.0060362
6.Thread类的其他方法
isAlive()
:返回线程是否活动的。getName()
:返回线程名。setName()
:设置线程名。
threading模块提供的一些方法:
threading.currentThread()
:返回当前的线程变量。threading.enumerate()
:返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。threading.activeCount()
:返回正在运行的线程数量,与len(threading.enumerate()) 有相同的结果。
from threading import Thread,currentThread,enumerate,activeCount
import time
def task():
print('子线程 start')
time.sleep(2)
print('子线程 end')
print(enumerate())
# print(currentThread(),'子线程')
if __name__ == '__main__':
t1 = Thread(target=task)
t2 = Thread(target=task)
t1.start()
t2.start()
# print(t1.is_alive()) # True
# print(t1.getName()) # Thread-1
# print(t2.getName()) # Thread-2
# t1.setName('班长')
# print(t1.getName())
print(currentThread().name)
# print(enumerate()) # [<_MainThread(MainThread, started 1856)>, <Thread(Thread-1, started 6948)>, <Thread(Thread-2, started 3128)>]
print(activeCount()) # 3
# print(len(enumerate())) # 3
7.多线程实现socket
server服务端
import socket
from threading import Thread
s=socket.socket()
s.bind(('127.0.0.1',8080))
s.listen(5)
def run(conn):
while True:
try:
data = conn.recv(1024)
print(data)
conn.send(data.upper())
except Exception:
break
if __name__ == '__main__':
while True:
print('等待客户端连接')
conn,addr = s.accept()
print(f'客服端{addr}连接成功')
t = Thread(target=run,args=(conn,))
t.start()
client客户端
import socket
s = socket.socket()
s.connect(('127.0.0.1',8080))
while True:
msg = input('>>>:').strip()
if not msg:
continue
s.send(msg.encode('utf-8'))
data = s.recv(1024)
print(data.decode('utf-8'))
创建多线程之threading.Thread的使用的更多相关文章
- python 线程之 threading(四)
python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...
- python 线程之 threading(三)
python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http: ...
- python 线程之 threading(二)
在http://www.cnblogs.com/someoneHan/p/6204640.html 线程一中对threading线程的开启调用做了简单的介绍 1 在线程开始之后,线程开始独立的运行直到 ...
- python 线程之 threading(一)
threading:基于对象和类的较高层面上的接口,threading模块在内部使用_thread模块来实现线程的对象以及常用的同步化工具的功能. 使用定制类的方式继承 threading.Threa ...
- “死锁” 与 python多线程之threading模块下的锁机制
一:死锁 在死锁之前需要先了解的概念是“可抢占资源”与“不可抢占资源”[此处的资源可以是硬件设备也可以是一组信息],因为死锁是与不可抢占资源有关的. 可抢占资源:可以从拥有他的进程中抢占而不会发生副作 ...
- 线程之threading
多任务:操作系统同时运行多个任务 线程:一个程序运行起来之后一定有一个执行代码的东西,该东西即为线程 线程是操作系统调度执行的最小单位 * 并发:指的是任务数多余cpu核数,通过操作系统的各种任务 ...
- python多线程之threading模块
threading模块中的对象 其中除了Thread对象以外,还有许多跟同步相关的对象 threading模块支持守护线程的机制 Thread对象 直接调用法 import threading imp ...
- python 线程之threading(五)
在学习了Event和Condition两个线程同步工具之后还有一个我认为比较鸡肋的工具 semaphores 1. 使用semaphores的使用效果和Condition的notify方法的效果基本相 ...
- python多线程之Threading
什么是线程? 线程是操作系统内核调度的基本单位,一个进程中包含一个或多个线程,同一个进程内的多个线程资源共享,线程相比进程是“轻”量级的任务,内核进行调度时效率更高. 多线程有什么优势? 多线程可以实 ...
随机推荐
- POI通用导出Excel数据(包括样式设计)
前言 前一段时间我写过通用的导入Excel,前几天也写了导出pdf格式的,还有我之前搞得导出Word,我在之前的博客也都介绍了导出和导入是一个道理,无非是一个获取一个是赋值.昨天有一位同仁看了我的Ex ...
- 通过Blazor使用C#开发SPA单页面应用程序(2)
今天我们尝试创建一个默认的Blazor应用. 1.安装 .Net Core 3.0需要Visual Studio 2019 的支持. 安装.Net Core 3.0 预览版 SDK版本,注意预览版对应 ...
- 【JS档案揭秘】第二集 Event loop与执行栈
我时常在思考关于JS的很多知识在工作中有什么用?是否只能存在于面试这种理论性的东西中,对于我们的业务和工作,它们又能扮演怎样的角色.以后在JS档案揭秘的每一期里,都会加入我对于业务的思考,让这些知识不 ...
- nginx之gzip压缩提升网站速度
目录: 为啥使用gzip压缩 nginx使用gzip gzip的常用配置参数 nginx配置gzip 注意 为啥使用gzip压缩 开启nginx的gzip压缩,网页中的js,css等静态资源的大小会大 ...
- 字典更新与K-SVD
字典更新与K-SVD 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 矩阵的奇异值分解 (Singular Value Decomposition, S ...
- iOS 11 变化
首先我是开发者,更关心对技术的影响,我又需要关注.学习哪些技术,猫神的文章:http://www.cocoachina.com/ios/20170607/19457.html 介绍了 ******** ...
- Facebook的早期历史
Facemash:谁更有吸引力?Facebook的起源 2003年,当时扎克伯格还是一名哈佛大学的二年级学生,他编写了一个名为Facemash的网站.他利用黑客技术入侵了学校管理部门的网站,并从中 ...
- mongo常用语法
首先要能进入控制台,进不去自己解决. 基本操作: show users:显示用户 show dbs:显示数据库列表 use <db name> 切换/创建数据库 show collecti ...
- JMeter用户参数
压测的时候,经常需要使用动态参数,即每次请求的参数不一样,这样才能更好的模拟真实的用户请求,我们首先能想到的也是最常见的就是用户ID 1. 用户参数 我们可以定义一个变量,然后指定多个值,这样每次请 ...
- CocosCreator上的游戏(调试)发布到微信小程序
1.下载CocosCreator,微信开发者工具 官网地址:http://www.cocos.com/download 官网下载:https://developers.weixin.qq.com/mi ...