python 多进程
一、程序:是一个指令的集合
二、进程:正在执行的程序;或者说:当运行一个程序,你就启动了一个进程
1.编写完的代码,没有运行时,为程序,正在运行的代码为进程
2.程序是静态的,进程是活动的
(1)、多进程中每个进程中所有数据(包括全局变量)都各自拥有一份,互不影响。
(2)、程序开始运行时,首先会创建一个主进程
在主进程(父进程)下,我们可以创建新的进程(子进程),子进程依赖于主进程,如果主进程结束,程序会退出。
Python 提供了非常好用的多进程包multiprocessing,借助这个包;可以轻松完成从单进程到并发执行的转换。
实例:
三、1.Process(target,name,args)
2.参数介绍:
-target 表示调用对象,即子进程执行的任务
-args表示调用对象的位置参数元组,args(1,)
-name为子进程的名称
四、Process 类常用方法:
-p.start(): 启动进程,并调用该子进程中的p.run()
-p.run():进程启动时运行的方法,正是他去调用target指定的函数,我们自定义类的类中一定要实现该方法
-p.terminate() 强制终止进程p,不会进行任何清理操作
-p.is_alive():如果p仍然运行,返回True用来判断进程是否还在运行
-p.join([timeout]):主进程等待p终止,timeout是可选的超时时间
五、全局变量在多个进程中不共享:进程之间的数据是 独立的,默认情况下互不影响
五、自定义进程类
# 自定义进程类,创建进程
import os
from multiprocessing import Process
class Test(Process):
def run(self):
print("无参数进程")
# 自定义进程类,创建进程,有参数的进程类
class MyProcess1(Process):
def __init__(self, name):
# 调用父类的初始化方法
super().__init__()
self.name = name
def run1(self):
print("带参数的自定义进程{}".format(self.name))
if __name__ == "__main__":
p = MyProcess1("参数")
p.run1()
六、进程抢票案例
import json
import time
from multiprocessing import Process, Lock
#查询和写入票数
def wr_info(sign, dic=None):
if sign == "r":
with open("ticket.txt", "r", encoding="utf-8") as fp:
dic = json.load(fp)
elif sign == "w":
with open("ticket.txt", "w+", encoding="utf-8") as fp:
dic = json.dump(dic, fp)
return dic
#抢票逻辑
def get_ticket(person):
dic = wr_info("r")
time.sleep(0.5)
if dic["ticket"] > 0:
print("{}抢到票了".format(person))
dic["ticket"] = dic["ticket"] - 1
wr_info("w", dic)
else:
if dic["ticket"] == 0:
print("{}没有抢到票".format(person))
#查看票数
def check_ticket(person,lock):
#查看票数
dic = wr_info("r")
print("{}查看票数目,剩余票的个数是{}".format(person, dic["ticket"]))
#加锁
lock.acquire()
#抢票
get_ticket(person)
#解锁
lock.release()
#print("{}没有抢到票,剩余票的个数是{}".format(person,dic["ticket"]))
if __name__ == "__main__":
lock = Lock()
lst = ["李四", "张三", "王五", "松子", "花生","花花"]
for i in lst:
p = Process(target=check_ticket, args=(i,lock))
p.start()
七、进程信号量
# Semaphore 信号量,本质是上锁,给多个进程上锁,可以控制同一时间上锁的数量
from multiprocessing import Semaphore,Process
import random
import time
def read_books(person,sem):
#上锁
sem.acquire()
print("{}在读书".format(person))
#随机延时1———4秒
time.sleep(random.randrange(1,4))
sem.release()
print("{}跑去吃饭了!".format(person))
if __name__ == "__main__":
#同一时间上4把锁
sem = Semaphore(4)
lst = ["张三","李四","王五","清风","明月","青梅","竹马","羌笛","杨柳"]
for i in lst:
p = Process(target=read_books,args=(i,sem))
p.start()