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()


posted @ 2020-02-22 18:21  微风轻哨  阅读(153)  评论(0编辑  收藏  举报