1.Manager

# ### Manager (list列表,dict字典)进程之间的共享数据(列表或字典等)
from multiprocessing import Process,Manager,Lock def work(data):
'''
#正常写法
lock.acquire()
#data['count'] -= 1
data[0] += 1
lock.release()
''' # 使用with 语法简化上锁解锁操作
with lock:
data[0] +=1 if __name__ == '__main__':
m = Manager()
data = m.dict({"count":2000})
date = m.list([1,2,3])
#print(data) lst = []
for i in range(100):
p = Process(target=work,args=(data,))
p.start()
lst.append(p) #确保所有的进程执行完毕,然后再向下运行,打印数据,否则报错
for i in lst:
i.join() print(data) #[101,2,3]
#print(data) #{'count':19900}

2.线程的使用

from threading import Thread
from multiprocessing import Process
import os,time #(1) 一份进程资源中可以包含多个线程
def func(num):
print("当前线程,所归属的进程id",os.getpid(),num) for i in range(10)
#(基于当前这个主进程创建了10个子线程,然后主进程本身就自带一个线程,一共11个)
t = Thread(target=func,args=(i,)) #创建线程跟进程对象用法一样,返回一个线程对象
t.start() #(2) 并发的多进程和多线程,谁的速度更快
def func(num):
print("当前线程,所归属的进程id",os.getpid(),num) if __name__ == '__main__':
#统计1000个线程的运行时间
#记录时间
starttime = time.time()
lst = []
for i in range(1000):
t = Thread(target=func,args=(i,))
t.start()
lst.append(t)
#确保所有线程执行完毕
for i in lst:
i.join()
#结束时间
endtime = time.time()
print('执行的时间是{}'.format(endtime-starttime)) #统计1000个进程的运行时间
#记录时间
starttime = time.time()
lst = []
for i in range(1000):
p = Process(target=func,args=(i,))
p.start()
lst.append(p)
#确保所有线程执行完毕
for i in lst:
i.join()
#结束时间
endtime = time.time()
print('执行的时间是{}'.format(endtime-star #(3)多线程共享同一份进程资源
num = 1000
def func():
global num
num -= 1 for i in range(1000):
t = Thread(target=func)
t.start()

3.用类定义线程

# ### 用类定义线程
from threading import Thread
import time
from threading import currentThread class MyThread(Thread): #继承父类
def __init__(self,name): #传参初始化的时候需要调用父类的构造方法
super().__init__()
self.name = name def run(self): #一定是run,不能乱写
#time.sleep(1)
print("当前进程正在执行running...",self.name) if __name__ =='__main__':
t = MyThread('机器会爆炸吗')
t.start()
print("主线程执行结束...") # ### 线程的一些相关函数
#线程.is_alive() #检测线程是否仍然存在
#线程.setName() #设置线程名字
#线程.getName() #获取线程名字
#1.currentThread().ident 查看线程id号
#2.enumerate() 返回目前正在运行的线程列表
#3.activeCount() 返回目前正在运行的线程数量 def func():
time.sleep(1) if __name__ == '__main__':
t = Thread(target=func)
#print(t)
t.start()
print(t)
print(t.is_alive()) #False
print(t.getName())
t.setName("xboyww")
print(t.getName()) #1.currentThread().ident 查看线程id号
def func():
print("子线程id",currentThread().ident,os.getpid()) if __name__ == '__main__':
Thread(target=func).start()
print("主线程id",currentThread().ident,os.getpid()) #2.enumerate() 返回目前正在运行的线程列表
from threading import enumerate
def func():
print("子线程id",currentThread().ident,os.getpid())
time.sleep(0.5)
if __name__ == '__main__':
for i in range(10):
Thread(target=func).start()
print(enumerate()) #3.activeCount() 返回目前正在运行的线程数量
from threading import enumerate
from threading import activeCount
def func():
print("子线程id",currentThread().ident,os.getpid())
time.sleep(0.5)
if __name__ == '__main__':
for i in range(10):
Thread(target=func).start()
lst = enumerate()
#子线程10个,主线程1个 用enumerate也可以返回线程数量
print(lst,len(lst))
#用activeCount()返回线程数量
print( activeCount())

4.守护线程

# ### 守护线程 :等待所有线程全部执行结束,在自己终止,守护所有线程
from threading import Thread
import time
def func1():
while True:
time.sleep(0.5)
print("我是func1") def func2():
print("我是func2 start...")
time.sleep(3)
print("我的func2 end...") t1 = Thread(target=func1)
t2 = Thread(target=func2) #在start调用之前,设置守护线程
t1.setDaemon(True) #守护线程要等待其他所有线程结束后,自己再结束 t1.start()
t2.start()#等待这个结束
print("主线程执行结束...") #等待这个结束

5.线程锁保证数据安全

# ### Lock 保证线程数据安全
from threading import Lock,Thread n = 0 def func1(lock):
global n
lock.acquire()
for i in range(1000000): n -= 1
lock.release() def func2(lock):
global n
with lock:
for i in range(1000000): n += 1
# func1()
# func2()
# print(n) # 0
if __name__ == '__main__':
lst = []
lock = Lock()
for i in range(10):
t1 = Thread(target=func1,args=(lock,))
t2 = Thread(target=func2,args=(lock,))
t1.start()
t2.start()
lst.append(t1)
lst.append(t2)
#等待所有的子线程执行结束之后,在打印数据
for i in lst:
i.join()
print("主线程执行结束...",n)

6.线程信号量Semaphore

# ### 信号量 Semaphore(线程)
from threading import Semaphore,Thread
import time def func(i,sm):
with sm:
print(i)
time.sleep(3) if __name__ == '__main__':
sm = Semaphore(5)
for i in range(20):
Thread(target=func,args=(i,sm)).start() '''
在创建线程的时候是异步创建
在执行任务的时候,因为Semphore加了锁,所以线程之间变成了同步
'''

进程之间共享数据Manager,线程相关使用Thread,用类定义线程,守护线程setDaemon,线程锁Lock,线程信号量Semaphore---day32的更多相关文章

  1. Python 进程之间共享数据

    最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享  在mp库当中,跨进程对象共享有三种方式,第一种 ...

  2. Python 进程之间共享数据(全局变量)

    进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 if __name__= ...

  3. VC++共享数据段实现进程之间共享数据

    当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段.; #pragma data_seg()//恢复到正常段继续编程 ...

  4. python进程之间修改数据[Manager]与进程池[Pool]

    #前面的队列Queue和管道Pipe都是仅仅能再进程之间传递数据,但是不能修改数据,今天我们学习的东西就可以在进程之间同时修改一份数据 #Mnager就可以实现 import multiprocess ...

  5. 进程间共享数据Manager

    一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...

  6. day33:进程锁&事件&进程队列&进程间共享数据

    目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 7.Manager:进程之间共享数据 锁 ...

  7. 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

    ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...

  8. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  9. 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码 ...

  10. Python multiprocessing.Manager介绍和实例(进程间共享数据)

    Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

随机推荐

  1. [转帖]【Redis】Redis中使用Lua脚本

    Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua具体语法参考:https://www.runoob. ...

  2. 使用 inotifywait的方式监控文件夹发生变化后自动执行脚本的方法

    0. 先安装inotify 最简单的方法为: yum install epel-release 安装扩展包源 yum install inotify-tools 1. 从网上抄了一下脚本 简单记录一下 ...

  3. KylinV10升级部分软件的简单方法

    背景 2022-12-26有同事晚上在群里反馈客户现场的测试环境内存紧张. 我这边第一反应是进程重复了,导致内存使用量飙升. 告知现场使用 ps -ef |grep java |grep caf 发现 ...

  4. CS231N Assignment1 softmax 笔记

    -为Softmax分类器实现完全矢量化的损失函数 -实现解析梯度完全矢量化的表达式 使用数值梯度检查实现结果 使用验证集调整学习率和正则化强度 使用SGD优化损失函数 可视化最终学习的权重 softm ...

  5. 去除elementUI中tab组件中的下划线

    <div class="right-tabbox-newnotice"> <el-tabs v-model="activeName" @tab ...

  6. MySQL 常见面试题/知识点总结!(2021 最新版)| JavaGuide

    相关阅读: 2.7w字!Java基础面试题/知识点总结!(2021 最新版) 这篇文章之前发过,不过,我最近对其进行了重构完善并且修复了很多小问题.所以,在公号再同步一下! 内容很硬!强烈建议小伙伴们 ...

  7. 人工智能自然语言处理:N-gram和TF-IDF模型详解

    人工智能自然语言处理:N-gram和TF-IDF模型详解 1.N-gram 模型 N-Gram 是一种基于统计语言模型的算法.它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作,形成 ...

  8. 【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例

    相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...

  9. 答疑解惑:解释在Mybatis-Spring下@Mapper与@MapperScan为何不能同时生效以及实现动态条件注册Mapper接口

    若项目中使用了@MapperScan注解后,则@Mapper注解不再生效, 原因是:@MapperScan注解 会执行@Import(MapperScannerRegistrar.class),而Ma ...

  10. SecureCRT使用sftp上传较大文件意外暂停

    今天在一台跳转机使用SecureCRT的sftp上传较大文件时,发现中途会时常停止传输,给出提示如下: 如果此时选择Accept Once,会继续传输,但是过一段时间后,还是会停止并给出相同提示,如果 ...