本文主要是介绍pyyhon_day35,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
Manager ( list 列表 , dict 字典 ) 进程之间共享数据
线程
用类定义线程
守护线程 : 等待所有线程全部执行完毕之后,自己在终止程序,守护所有线程
线程中的数据安全问题
信号量 Semaphore (线程)
互斥锁 死锁 递归锁
事件
Manager ( list 列表 , dict 字典 ) 进程之间共享数据
from multiprocessing import Process , Manager ,Lockdef mywork(data,lock):# 共享字典"""lock.acquire()data["count"] -= 10lock.release()"""# 共享列表data[0] += 1if __name__ == "__main__":lst = []m = Manager()lock = Lock()# 多进程中的共享字典# data = m.dict( {"count":5000} )# print(data , type(data) )# 多进程中的共享列表data = m.list( [100,200,300] )# print(data , type(data) )""""""# 进程数超过1000,处理该数据,死机(谨慎操作)for i in range(1000):p = Process(target=mywork,args=(data,lock))p.start()lst.append(p)# 必须等待子进程所有计算完毕之后,再去打印该字典,否则报错;for i in lst:i.join()print(data)
线程
# ### 线程
"""
进程是资源分配的最小单元
线程是cpu执行调度的最小单元
"""# (1) 一个进程里包含了多个线程,线程之间是异步并发
from threading import Thread
from multiprocessing import Process
import os , time , random"""
def func(i):time.sleep(random.uniform(0.1,0.9))print("当前进程号:{}".format(os.getpid()) , i)if __name__ == "__main__":for i in range(10):t = Thread(target=func,args=(i,))t.start()print(os.getpid())
"""# (2) 并发的多进程和多线程之间,多线程的速度更快
# 多线程速度
def func(i):print( "当前进程号:{} , 参数是{} ".format(os.getpid() , i) )"""
if __name__ == "__main__":lst = []startime = time.time()for i in range(10000):t = Thread(target=func,args=(i,))t.start()lst.append(t)# print(lst)for i in lst:i.join()endtime = time.time()print("运行的时间是{}".format(endtime - startime) ) # 运行的时间是1.8805944919586182
"""
# 多进程速度
"""
if __name__ == "__main__":lst = []startime = time.time()for i in range(10000):p = Process(target=func,args=(i,))p.start()lst.append(p)# print(lst)for i in lst:i.join()endtime = time.time()print("运行的时间是{}".format(endtime - startime) ) # 运行的时间是101.68004035949707
"""# (3) 多线程之间,数据共享
num = 100
lst = []
def func():global numnum -= 1for i in range(100):t = Thread(target=func)t.start()lst.append(t)for i in lst:i.join()print(num)
用类定义线程
from threading import Thread
import os,time# (1)必须继承父类Thread,来自定义线程类
"""
class MyThread(Thread):def __init__(self,name):# 手动调用父类的构造方法super().__init__()# 自定义当前类需要传递的参数self.name = namedef run(self):print( "当前进程号{},name={}".format(os.getpid() , self.name) )if __name__ == "__main__":t = MyThread("我是线程")t.start()print( "当前进程号{}".format(os.getpid()) )
"""# ### 线程中的相关属性
"""
# 线程.is_alive() 检测线程是否仍然存在
# 线程.setName() 设置线程名字
# 线程.getName() 获取线程名字
# 1.currentThread().ident 查看线程id号
# 2.enumerate() 返回目前正在运行的线程列表
# 3.activeCount() 返回目前正在运行的线程数量
"""
"""
def func():time.sleep(1)
if __name__ == "__main__":t = Thread(target=func)t.start()# 检测线程是否仍然存在print( t.is_alive() )# 线程.getName() 获取线程名字print(t.getName())# 设置线程名字t.setName("抓API接口")print(t.getName())
"""from threading import currentThread
from threading import enumerate
from threading import activeCount
def func():time.sleep(0.1)print("当前子线程号id是{},进程号{}".format( currentThread().ident ,os.getpid()) )if __name__ == "__main__":t = Thread(target=func)t.start()print("当前主线程号id是{},进程号{}".format( currentThread().ident ,os.getpid()) )for i in range(5):t = Thread(target=func)t.start()# 返回目前正在运行的线程列表lst = enumerate()print(lst,len(lst))# 返回目前正在运行的线程数量 (了解)print(activeCount())
守护线程 : 等待所有线程全部执行完毕之后,自己在终止程序,守护所有线程
from threading import Thread
import time
def func1():while True:time.sleep(1) print("我是函数func1")def func2():print("我是func2 start ... ")time.sleep(3)print("我是func2 end ... ")def func3():print("我是func3 start ... ")time.sleep(6) print("我是func3 end ... ")if __name__ == "__main__":t = Thread(target=func1)t2 = Thread(target=func2)t3 = Thread(target=func3)# 设置守护线程 (启动前设置)t.setDaemon(True)t.start()t2.start()t3.start()print("主线程执行结束.... ")
线程中的数据安全问题
from threading import Thread , Lock
import timen = 0def func1(lock):global nlock.acquire() for i in range(1000000): n += 1lock.release()def func2(lock):global n# with语法可以简化上锁+解锁的操作,自动完成with lock:for i in range(1000000):n -= 1if __name__ == "__main__":lst = []lock = Lock()start = time.time()for i in range(10):t1 = Thread(target=func1 ,args=(lock,) )t1.start()t2 = Thread(target=func2 ,args=(lock,) )t2.start()lst.append(t1)lst.append(t2)for i in lst:i.join()# print(lst,len(lst))end = time.time()print("主线程执行结束... 当前n结果为{} ,用时{}".format(n , end-start))
信号量 Semaphore (线程)
"""同一时间对多个线程上多把锁"""
from threading import Thread,Semaphore
import time , randomdef func(i,sem):time.sleep(random.uniform(0.1,0.7))# with语法自动实现上锁 + 解锁with sem: print("我在电影院拉屎 .... 我是{}号".format(i))if __name__ == "__main__":sem = Semaphore(5)for i in range(30):Thread(target=func,args=(i,sem)).start()print(1)
"""创建线程是异步的,上锁的过程会导致程序变成同步;
"""
互斥锁 死锁 递归锁
事件
# ### 事件 Event
from threading import Thread , Event
import time,random
"""
wait : 动态加阻塞 (True => 放行 False => 阻塞)
is_set : 获取内部成员属性值是True 还是 False
set : 把False -> True
clear : 把True -> False
"""
# (1) 基本语法
"""
e = Event()
print(e.is_set())
e.set()
print(e.is_set())
e.wait()
e.clear()
# 最多阻塞三秒,放行
e.wait(3)
print("代码执行中 ... ")
"""
这篇关于pyyhon_day35的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!