Python快速入门(十三)多进程


前言:主要介绍使用继承实现多任务、获取进程的pid、进程的运行顺序、给process传递参数、通过queue来实现数据共享、进程池等介绍。


1.使用进程实现多任务

代码:

import time
import multiprocessing

def test1():
    while True:
        print("1----")
        time.sleep(1)

def test2():
    while True:
        print("2----")
        time.sleep(1)

def main():
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    p1.start()
    p2.start()

if __name__ == '__main__':
    main()

运行截图:
在这里插入图片描述

2.获取进程的pid

代码:

import os
import time
import multiprocessing


def test1():
    while True:
        print("子进程 pid = %d  父进程 pid = %d" % (os.getpid(), os.getppid()))
        time.sleep(1)

def main():
    print("主进程 pid = %d  父进程 pid = %d" % (os.getpid(), os.getppid()))
    p1 = multiprocessing.Process(target=test1)
    p1.start()


if __name__ == '__main__':
    main()

运行截图:
在这里插入图片描述

3.进程的运行顺序

代码:

import os
import time
import multiprocessing


def test1():
    while True:
        print("子进程1 pid = %d  父进程 pid = %d" % (os.getpid(), os.getppid()))
        time.sleep(1)

def test2():
    while True:
        print("子进程2 pid = %d  父进程 pid = %d" % (os.getpid(), os.getppid()))
        time.sleep(1)

def main():
    print("主进程 pid = %d  父进程 pid = %d" % (os.getpid(), os.getppid()))
    p1 = multiprocessing.Process(target=test1)
    p1.start()

    p2 = multiprocessing.Process(target=test2)
    p2.start()

if __name__ == '__main__':
    main()

运行截图:
在这里插入图片描述

4.给process传递参数

代码:

import multiprocessing
import os

def test(a, b, c, *args, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)

def main():
    print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid()))
    p = multiprocessing.Process(target=test, args=(11, 22, 33, 44, 55, 66, 77, 88), kwargs={"mm": 11})
    p.start()

if __name__ == '__main__':
    main()

运行截图:
在这里插入图片描述

5.多进程之间不共享全局变量

import multiprocessing
import os
import time

nums = [11, 22, 33]

def test():
    nums.append(44)
    print("在进程中1中nums = %s" % str(nums))
    time.sleep(3)

def test2():
    print("在进程中2中nums = %s" % str(nums))

def main():
    print("主进程 pid = %d  父进程pid = %s" %(os.getpid(), os.getppid()))
    p = multiprocessing.Process(target=test)
    p.start()

    # time.sleep(1)
    p.join()

    p2 = multiprocessing.Process(target=test2)
    p2.start()

if __name__ == '__main__':
    main()

运行截图:
在这里插入图片描述

6.多进程之间通过queue来实现数据共享

import multiprocessing

"""
一个进程向Queue中写入数据,另外一个进程从Queue中获取数据,
通过Queue完成了 多个需要配合的进程间的数据共享,从而能够 起到 解耦的作用
"""
def download_from_web(q):
    """下载数据"""
    # 模拟从网上下载的数据
    data = [11, 22, 33, 44]

    # 向队列中写入数据
    for temp in data:
        q.put(temp)

    print("---下载器已经下载完了数据并且存入到队列中----")

def analysis_data(q):
    """数据处理"""
    waitting_analysis_data = list()
    # 从队列中获取数据
    while True:
        data = q.get()
        waitting_analysis_data.append(data)
        if q.empty():
            break
    # 模拟数据处理
    print(waitting_analysis_data)

def main():
    # 1. 创建一个队列
    q = multiprocessing.Queue()

    # 2. 创建多个进程,将队列的引用当做实参进行传递到里面
    p1 = multiprocessing.Process(target=download_from_web, args=(q,))
    p2 = multiprocessing.Process(target=analysis_data, args=(q,))
    p1.start()
    p2.start()

if __name__ == "__main__":
    main()

运行截图:
在这里插入图片描述

7.进程池

代码:

import multiprocessing

def worker(name1, name2):

    new_name = name1+name2
    print(new_name)

def main():

    # 创建进程池
    po = multiprocessing.Pool(5)

    # 向进程池中添加任务
    for i in range(0,10):
        po.apply_async(worker, args=("fly1-{}".format(i), "fly2--{}".format(i)))

    po.close()
    po.join()

if __name__ == "__main__":
    main()

运行截图:
在这里插入图片描述


结束!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值