ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

多进程

2019-09-02 22:51:53  阅读:220  来源: 互联网

标签:__ PID zx 进程 import multiprocessing


多进程

由于python的GIL锁,多进程才能够实现并行

多进程的PID

from multiprocessing import Process
import os
import time

class zx(Process):
    def run(self):
        time.sleep(1)
        print(f"{self.name}的PID为{os.getpid()},他的fu进程PID为{os.getppid()}")

if __name__ == '__main__':
    j1=zx()
    j1.start()
    j2=zx()
    j2.start()
    j3=zx()
    j3.start()

zx-3的PID为21236,他的fu进程PID为13116
zx-2的PID为20108,他的fu进程PID为13116
zx-1的PID为4312,他的fu进程PID为13116

他们的父进程都为主进程,因为是主进程创建的

守护进程

守护线程为方法,守护进程为一个属性

from multiprocessing import Process
import os
import time

class zx(Process):
    def run(self):
        time.sleep(1)
        print(f"{self.name}的PID为{os.getpid()},他的fu进程PID为{os.getppid()}")
        
js=[]
if __name__ == '__main__':
    j1=zx()
    js.append(j1)
    j2=zx()
    js.append(j2)
    j3=zx()
    js.append(j3)
    for i in js:
        i.daemon=True
        i.start()
    print("end")

end

进程同步

虽然进程的资源是相互独立的,但是多进程是并行,可能在同一时间去抢占系统的资源,比如屏幕资源

注意:这个锁是进程模块的锁

import multiprocessing
import time

def zx (i,lock):
    lock.acquire()
    time.sleep(0.5)
    print(i)
    lock.release()

if __name__ == '__main__':
    lock=multiprocessing.Lock()
    for i in range(10):
        i=multiprocessing.Process(target=zx,args=(i,lock))
        i.start()

进程间通讯

Queue和pipe只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据。

进程队列Queue

原理...

import multiprocessing
import time

q=multiprocessing.Queue(3)
def zx(q):
    while 1:
        time.sleep(0.5)
        q.put("来啊客官")

if __name__ == '__main__':
    j=multiprocessing.Process(target=zx,args=(q,))
    j.start()
    while 1:
        print(q.get())

管道

from multiprocessing import Process, Pipe

def f(conn):
    conn.send("爸爸你好!")
    response=conn.recv()
    print(response)
    conn.close()
    
if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())   # prints "[42, None, 'hello']"
    parent_conn.send("儿子你好!")
    p.join()

爸爸你好!
儿子你好!

Managers

from multiprocessing import Process, Manager

def f(d, l,n):
    d[n] = '1'
    d['2'] = 2
    d[0.25] = None
    l.append(n)

if __name__ == '__main__':

    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(5))
        p_list = []

        for i in range(10):
            p = Process(target=f, args=(d,l,i))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()

        print(d)
        print(l)

{6: '1', '2': 2, 0.25: None, 2: '1', 7: '1', 1: '1', 4: '1', 0: '1', 3: '1', 8: '1', 5: '1', 9: '1'}
[0, 1, 2, 3, 4, 6, 2, 7, 1, 4, 0, 3, 8, 5, 9]

进程池

  • apply 同步 相当于串行

  • apply_async 异步

    可以加回调函数,注意,回调函数是运行在主进程的

    可以返回子进程的run函数return

import multiprocessing
import time

def zx(i):
    time.sleep(0.5)
    print(i)
if __name__ == '__main__':
    #默认进程池的数量为你电脑的cpu数量
    pool=multiprocessing.Pool()

    for i in range(40):
        pool.apply_async(zx,args=(i,))
    pool.close()
    pool.join()
    print("搬砖结束")

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
搬砖结束

标签:__,PID,zx,进程,import,multiprocessing
来源: https://www.cnblogs.com/zx125/p/11449535.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有