创建多线程之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
什么是线程? 线程是操作系统内核调度的基本单位,一个进程中包含一个或多个线程,同一个进程内的多个线程资源共享,线程相比进程是“轻”量级的任务,内核进行调度时效率更高. 多线程有什么优势? 多线程可以实 ...
随机推荐
- 源码解读 Spring Boot Profiles
前言 上文<一文掌握 Spring Boot Profiles> 是对 Spring Boot Profiles 的介绍和使用,因此本文将从源码角度探究 Spring Boot Profi ...
- windiows下搭建python+selenium+unittest+Chrome的Web自动化环境
一.selenium.unittest概念 Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架.它是一款用于运行端到端功能测试的超强工具.您可以使用多个编程语言编写测试,并且 ...
- 面试java后端面经_2
1 自我介绍(介绍一下帅气的自己哦) 2 对象深浅复制(浅复制:对象内引用的对象不会复制,深复制会把引用对象复制.如何进行深浅复制,这块不懂的童鞋可以百度一下) 3 wait方法和sleep方法的区别 ...
- neural_transfer风格迁移
ContentLoss 首先是要定义一个内容差异损失函数,这里直接调用functional.mse_loss(input,self.target)就可以计算出其内容差异损失. 注意这里一般是定义一个网 ...
- xpath中normalize-space的用法【转载】
下面这个菜单中,要点击“货运表现”,我们来看一下xpath, 菜单中的所有项的id都是“vertab”,所以不能用id来定位,那么先用文本的xpath试试 //a[text()='货运表现'] 发现定 ...
- Mybatis-plus的两种分页插件的配置方式
第一种: package com.paic.ocss.gateway.admin.config; import com.baomidou.mybatisplus.plugins.PaginationI ...
- 智能家居系列之——WIFI小车
2017年准备搬新家了,一直关注着树莓派的论坛,看有没有新玩意,想着今年过年在杭州过年,头一次在城里过年,感觉特别无聊,没有麻将可以打,没有鞭炮可以放,只能在家做做小玩意.从小就对四驱车有兴趣,一直想 ...
- emlog博客的安装教程
简介 emlog 是一款基于PHP和MySQL的功能强大的博客及CMS建站系统.致力于为您提供快速.稳定,且在使用上又极其简单.舒适的内容创作及站点搭建服务. 安装步骤 1.将src文件夹下的所有文件 ...
- 转载 江南一点雨 一键部署docker
一键部署 Spring Boot 到远程 Docker 容器,就是这么秀! 不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 To ...
- I-Just Jump_2019牛客暑期多校训练营(第八场)
题目链接 Just Jump 题意 有L+1个点,初始在第0个点上,要跳到第L个点,每次至少跳d格,也就是在点x至少要跳到x+d,且有m个限制 \((t_i, p_i)\)指跳第\(t_i\)次不能跳 ...