python-网络编程 (个人学习笔记1.1)--python中的多进程(multiprocessing模块)

一、多进程提要

什么是进程:

进程:在了解多线程的前提下,可以把某几个关联线程的集合叫做进程,又或者正在运行中的程序,是一个进程

python多进程须知:

(1) python多进程

为了解决python中,因为GIL(全局解释器锁)的存在,而不能使用更加完整的多线程的问题,想要更加充分的使用cpu资源,在python中,大部分情况要使用到多进程,同时在python中,它提供了一个名为multiprocessing的多进程模块帮助程序员更方便的使用python中的多进程。

(2)缺点提要

在多进程中,通常需要避免共享资源。
与多线程不同,在多进程中,每个进程间,都是相互独立的,它无法做到多个进程间直接共用某个全局变量。
当然,解决该问题,可以使得多个进程关联某个主进程,实现多个进程间的内存共享,而这样做的缺点在于提高了程序的复杂度,同时因为需要同步进程的原因,降低了程序的执行效率。

二、multiprocessing模块

提要:multiprocessing模块的基本调用格式,与多线程threading模块相似

1.创建多进程

import multiprocessing
import time

def run(ret):
    time.sleep(1)
    print('running....%s'%ret)

if __name__ == '__main__':
    list1 = []
    for i in range(5):
        multi1 = multiprocessing.Process(target=run, args=('lists..',))
        list1.append(multi1)

    for p in list1:
        p.start()

输出:

running....lists..
running....lists..
running....lists..
running....lists..
running....lists..

2.类创建多进程

import multiprocessing
import os
import time

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

    def run(self):		#重写父类中的run方法
        time.sleep(1)
        print('This is father process id:%s'%os.getpid())
        print('This is son process id:%s'%os.getppid())
        print('process name:%s'%self.name)


if __name__ == '__main__':

    process1 = Myprocess('Cj')
    process1.start()
    process1.join()

    process2 = Myprocess('azhe?')
    process2.start()

输出:

This is father process id:9956
This is son process id:14108
process name:Cj
This is father process id:1732
This is son process id:14108
process name:azhe?

3.进程通讯工具:Queue

以下为:支进程拿取主进程数据

from multiprocessing import Process, Queue

def f(q):
    q.put(['这是进程Queue,不是线程queue'])

if __name__ == '__main__':
    q = Queue()
    list1=[]
    for i in range(3):
        p = Process(target=f, args=(q,))
        list1.append(p)
        p.start()

    for t in range(3):
        print(q.get())

    for i in list1:
        i.join()

4.进程通讯工具:Pipe

from multiprocessing import Process, Pipe


def f(conn):
    conn.send(['这就是Pipe'])
    conn.close()


if __name__ == '__main__':

    father_conn,son_conn = Pipe()       #Pipe()将返回两个对象,一个是当前进程端口,一个是通讯进程端口

    p = Process(target=f, args=(son_conn,))
    p.start()
    print(father_conn.recv()) 
    p.join()

输出:

['这就是Pipe']

5.进程通讯工具:Manager

以下为:通过主进程为支进程空字典和列表赋值

from multiprocessing import Process,Manager

def function(p,d,i):
    p[i] = 'zhe?'
    d.append('???')
    print(i)

if __name__ == '__main__':

    with Manager() as f:
        P_dict = f.dict()
        P_list = f.list()

        press_list = []

        for i in range(3):
            p = Process(target=function , args=(P_dict,P_list,i))
            press_list.append(p)
            p.start()

        for i in press_list:
            i.join()

        print(P_dict)
        print(P_list)

输出:

1
0
2
{1: 'zhe?', 0: 'zhe?', 2: 'zhe?'}
['???', '???', '???']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值