学习日记0905 进程与进程相关知识点

1 开启进程的两种方式

  方式一:

from multiprocessing import Process
import time

def task(name):
    print('%s is running' %name)
    time.sleep(3)
    print('%s is done' %name)

# 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
if __name__ == '__main__':
    p=Process(target=task,args=('egon',)) #Process(target=task,kwargs={'name':'egon'})
    p.start() # 只是向操作系统发送了一个开启子进程的信号
    print('')

  方式二:

    补充:开启进程实际就是在调用Process下面的run方法

 

from multiprocessing import Process
import time

class Myprocess(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name

    def run(self):
        print('%s is running' %self.name)
        time.sleep(3)
        print('%s is done' %self.name)

# 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
if __name__ == '__main__':
    p=Myprocess('egon')
    p.start() # 只是向操作系统发送了一个开启子进程的信号
    print('')

join方法的使用与介绍:

    等待含有join方法(与time.sleep()相似 相当于wait)的子进程结束才会运行其他进程

from multiprocessing import Process
import time

def task(name,n):
    print('子进程开启', name)
    time.sleep(n)
    print('子进程结束!',name)

if __name__ == '__main__':

    p = Process(target=task,kwargs={'name':'egon','n':3})
    p.start()
    p.join()
    p2 = Process(target=task, kwargs={'name': 'beard', 'n': 1})
    p2.start()
    print('这是主进程!')

  运行结果:

3 知识点补充:

  每个进程之间是在内存中是相互隔离的

4 查看进程的pid

  每个进程在内中都有一个id,这个id叫pid

  获取pid有两种方式:

    方式一:

      current_process().pid

from multiprocessing import Process,current_process
import time

def task():
    print('%s is running' %current_process().pid)
    time.sleep(30)
    print('%s is done' %current_process().pid)

if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    print('',current_process().pid)

      os.getpid()

from multiprocessing import Process
import os 

def task():
    print('%s is running' %os.getpid())
    time.sleep(30)
    print('%s is done' %os.getpid())

if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    print('',os.getpid())

5 僵尸进程与孤儿进程

  僵尸进程:没有被系统回收的进程,该进程会一直的占用内存空间

    孤儿进程:(在linux系统中)父进程是init的进程

6 守护进程

  本质就是一个子进程,该进程的生命周期<=被守护的进程

  在子进程中加入p.daemon = True 注意 此代码要加在p.start()前面

from multiprocessing import Process
import time

def task(name):
    print('老太监%s活着....' %name)
    time.sleep(3)
    print('老太监%s正常死亡....' %name)

if __name__ == '__main__':
    p=Process(target=task,args=('刘清政',))
    p.daemon=True
    p.start()
    time.sleep(1)
    print('皇上:EGON正在死...')

7 互斥锁

  互斥锁的作用是将本来并发的进程编程串行

例如:

import json
import time,random
from multiprocessing import Process,Lock

def search(name):
    with open('db.json','rt',encoding='utf-8') as f:
        dic=json.load(f)
    time.sleep(1)
    print('%s 查看到余票为 %s' %(name,dic['count']))

def get(name):
    with open('db.json','rt',encoding='utf-8') as f:
        dic=json.load(f)
    if dic['count'] > 0:
        dic['count'] -= 1
        time.sleep(random.randint(1,3))
        with open('db.json','wt',encoding='utf-8') as f:
            json.dump(dic,f)
            print('%s 购票成功' %name)
    else:
        print('%s 查看到没有票了' %name)

def task(name,mutex):
    search(name) #并发
    mutex.acquire()
    get(name) #串行
    mutex.release()

    # with mutex:
    #     get(name)

if __name__ == '__main__':
    mutex = Lock()
    for i in range(10):
        p=Process(target=task,args=('路人%s' %i,mutex))
        p.start()

 

 

 

posted @ 2018-09-05 16:03  周建豪  阅读(101)  评论(0编辑  收藏  举报