(新手)python的多进程(简单的多进程,多进程通信,多进程通过文件通信,进程池)

1多进程:
像要了解多进程,首先就要先了解概念:程序、进程、线程。

#1个.py文件就可以叫:程序   是静态概念
#进程:  一个分配资源的基本单位,是一个程序运行及分配到它手上的资源的统称
#线程:  运行进程进行动作的基本单位

那么我们来写一个简单的多进程:

import os
import multiprocessing
def work():
    for i in range(5):
        print('work1',i)
        print('当前进程:',multiprocessing.current_process().pid)    #获取当前进程编号
        print('父进程id:',os.getppid())          #ppid是父进程,pid是当前进程
if __name__ == '__main__':
    process = multiprocessing.Process(target=work)  #主进程里创建子进程
    process.start()
    print('当前进程编号:',os.getpid())

2多进程之间的通信:
多进程之间,或者说进程之间,全局变量不共享,所以需要有一个第三方通道来传递参数,使进程间实现通信,也就是实现变量共享

#用消息队列,来进行多进程之间通信

import multiprocessing
if __name__ == '__main__':
    queue = multiprocessing.Queue(maxsize=3)   #空间存三条
    #向队列里面放入消息
    queue.put('hello')
    queue.put(1)
    queue.put([1,2,3])
    # queue.put({'a':1},timeout=1)   #(要传的参数,溢出时间)
    print(queue)
    print(queue.get())
    print(queue.get())
    print(queue.get())
    print(queue.get(timeout=1))   #一共只存了三条消息,所以导出第四条是导不出的,但是搜索不到就一直卡在搜索那里,所以设置一个溢出时间,超过时间的放弃执行此次搜索,返回错误

3多进程之间通过文件通信:
我们现在知道,进程之间是不共享全局变量的,我们要让他共享,就得进程通信,那么不用queue这个函数,我们还可以怎么实现通信呢?没错,就是可以通过文件来通信。queue实质上也只是提供了一个类似保管平台一样的东西,使的变量通过这个平台来传递参数,甲传给乙,甲本来就知道变量是多少,乙收到,也知道了变量是多少,这样一来,双方都知道变量了,换个说法,也就是实现了双方的信息共享,也就是通信了

# 通过文件来进行多进程间通信

import multiprocessing


def write(wenjan,data):

    f = open(wenjan,'w')

    # f.seek(0)
    # f.truncate()  # 清空文件

    f.write(data)
    f.close()


def read(wenjian):
    g=open(wenjian,'r')
    nei_rong = g.read()
    # g.truncate()

    g.close()
    print('内容是:',nei_rong)


if __name__ == '__main__':
    data = input('请输入要传递数据:')
    # queue = multiprocessing.Queue(maxsize=5)
    wenjian = '123.text'
    t1 = multiprocessing.Process(target=write,args=(wenjian,data))
    t2 = multiprocessing.Process(target=read,args=(wenjian,))
    t1.start()
    t1.join()
    t2.start()

4 进程池:

# 进程池是由多个子进程组成,使用程序创建子进程

def a(index):
    print(index)
    print(os.getpid())      #查看进程id
    time.sleep(2)
import os
import time
import multiprocessing
if __name__ == '__main__':
    pool = multiprocessing.Pool(3)   #创建进程池(一次可以用三个子进程)
    for i in range(10):
        pool.apply_async(a,(5,))            #非阻塞方式调用(调用好会释放池子里的进程(进程id:x,进程id:y,进程id:z)  ,   进程(进程id:x,进程id:y,进程id:z)可以重新被利用)
    pool.close()   #关闭池子,不接受任务
    pool.join()    #池子操作完成后,join是用来执行参数代码,然后再运行主进程

猜你喜欢

转载自blog.csdn.net/sui_yi123/article/details/81782833