avatar

AngYi

Aim for the stars, and beyond.

  • 首页
  • 分类
  • 标签
  • 归档
  • 相册
  • 关于我
Home Python 多进程
文章

Python 多进程

Posted 2022-04-4 Updated 2023-10- 17
By AngYi
9~11 min read

进程

进程时系统分配资源的单位,一个进程可以有多个线程;
进程的状态有:新建,就绪,运行,等待,死亡。
并行 : 真的多任务; 并发: 假的多任务;

multiprocessing

import multiprocessing
import time

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

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

def main():
    p1 = multiprocessing.Process(target=singing)
    p2 = multiprocessing.Process(target=dancing)

    p1.start()
    p2.start()


if __name__ == "__main__":
    main()

多进程的创建与多线程极其相似。线程一般是共享主进程的一些变量,而进程可以理解为将主进程的资源复制一份,相比于线程,进程耗费的资源较多。
同一台电脑启动两个微信,就是两个进程。而一个微信,开多个聊天框,就是多线程。
进程是完全独立的,于线程不同,需要某个介质,实现线程之间的通信
图片.png

通过队列完成进程通信

队列,先进先出。

from multiprocessing import Queue
##
myque = Queue(3)

myque.put(1)
myque.put(2)
myque.put(3)
myque.put(4) # 超过队列长度 ,会等待
myque.get() 
myque.get()
myque.get()
myque.get()# 先放谁 先取谁。如果为空,就会等待,阻塞

生产者消费者线程,利用队列进行通信

from multiprocessing import Process,Queue,set_start_method,get_context
import time
def download_from_web(q):
    i=0
    while True:
        i += 1
        q.put(i)
        print(f'放入{i}')
        time.sleep(1)

def analysis_data(q):
    """处理数据"""
    watting_analysis_data = list()
    while True:
        data = q.get()
        watting_analysis_data.append(data)
        print(watting_analysis_data)
        time.sleep(4)
        # if q.empty():  # 如果放的很慢  就会停掉消费者
        #     break


    # print(watting_analysis_data)


def main():
    q = Queue(10)
    # 放入和取出 两边都while true,这样队列没有的话,不能取,会等待放入
    # 队列满了的话 不能放,会等待取出
    ctx = get_context('fork')
    p1 = ctx.Process(target=download_from_web,args=(q,))
    p2 = ctx.Process(target=analysis_data,args=(q,))
    p1.start()
    p2.start()

if __name__ == "__main__":
    main()

进程池

当要创建的进程数量不多时,可以利用multiprocessing中的Procss动态生成多个进程,但如果需要创建成千上百个目标,可以利用进程池Pool方法。

from multiprocessing import Pool
import os, time, random

def work(i):
    
    time.sleep(random.random()*3)
    print("进程{} running ....".format(i),"--pid {}".format(os.getpid()))



if __name__ == '__main__':

    po = Pool(3)

    for i in range(10):
        po.apply_async(work,(i,))

    print("-----start-------")
    po.close()
    po.join()
    print("-----end-------")

线程池里的Queue 需要用multiprocessing 下的manager.queue。

编程语言
python
License:  CC BY 4.0
Share

Further Reading

Oct 15, 2022

Python算发开发项目模版

1. 前言这篇文章主要介绍如何编写有组织的、模块化的和可扩展的python代码。一个机器学习或者深度学习的工程项目,应该像软件开发一样,被视为一个整体。因此,这个项目应该具备这些东西:OOP,TypeChecking,Doc。模块之间遵循设计模式最根本的原则:低耦合高内聚。

Apr 18, 2022

JavaScript基础

JavaScript1. 简介JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明

Apr 4, 2022

python 协程、async & 异步

OLDER

Python 多线程

NEWER

Python 迭代器、生成器

Recently Updated

  • DeepSeek 创始人梁文峰采访:创新、人才与中国 AI 发展
  • 福州-厦门之行
  • 我有自己的摄影网站啦
  • 借助Ollama一键本地部署CodeGeex,让AI帮你打工
  • Dash 进阶技巧

Trending Tags

ssh linux matlab 感悟 读书 blog git python flask ML

Contents

©2025 AngYi. Some rights reserved.

Using the Halo theme Chirpy