惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
A
About on SuperTechFans
博客园 - Franky
Engineering at Meta
Engineering at Meta
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
Last Week in AI
Last Week in AI
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
V
V2EX
G
Google Developers Blog

碎言

不懂就别瞎掰掰:【程序员的常识】写的什么玩意? AI 辅助编程下的程序设计与代码编写 使用 Next.js 和 Tailwind CSS 构建可编辑和删除的 ToDo 待办事项应用 探索编程新境界:MarsCode 助你一臂之力 使用 Next.js 和 Tailwind CSS 搭建静态图片展示站点并部署到 Vercel AI 辅助编程:免费工具的优缺点及官网一览 GitHub push更新总是失败,写个python脚本解决 把博客从GitHub迁移到到了vercel ComfyUI 和 Flux.1 安装与使用教程 Flux.1 入门必知:硬件、环境、模型 Git项目的子文件夹中的内容无法同步到远程仓库的解决方法 blender流体Fluid使用中没有流体、流体穿模等一些问题的解决方法 博客聚合网站:积薪,竟然关闭了! blender日常使用中的一些技巧 虽然只有我自己在用,但还是更新了碎言博客的源代码, 与其在迷茫中困惑,不如在努力中前进 差点忘了我还有一个博客... 秧歌、博客和AI 终于熬到了新手上路 好久没有更新博客了。。。 老妈大腿骨骨折,最近一直在医院护理 Hello, September! Ubuntu开机自动启动Docker容器运行WordPress Docker 简单快速安装部署WordPress Docker下安装MySQL 加碘盐能防核辐射的话,还怕什么核战争? shields.io 一个简洁、一致、清晰的徽章 Ubuntu下使用root登录ssh的设置 GitHub Actions 构建、部署 Next.js项目 我又用回了"IE"--edge
Python并发编程(上)进程模块multiprocessing模块和Process类
J.sky · 2017-10-06 · via 碎言

Python中为什么要用多进程编程?

由于Python解释器中使用了内部的GIL全局解释器锁,使得Python多线程的并发在任意时刻只允许单个CPU来运行,这样的运行方式会影响程序的并发。 当程序是在I/O密集时,CPU可能会有更多的空闲处理多线程的并发,这种情况下一般是没有问题的。如果是大量计算密集型的应用,如果使用多线程来并发,性能会大大降低,这个时候,我们就得考虑使用进程Process来进行编程及通信了。

创建进程Process(方法1)

import time, os
from multiprocessing import Process
def clock(x,y):
    for i in range(x):
        print('当前时间=={0}'.format(time.ctime()))
        time.sleep(y)
if __name__ == '__main__':
    p = Process(target=clock,args=(5,1))
    p.start()
    p.join()

创建进程Process(方法2)

import time, os
from multiprocessing import Process
class ClockProcess(Process):
    def __init__(self,x,y):
        Process.__init__(self)
        self.x=x
        self.y=y

    def run(self):
        for i in range(self.x):
            print('{0}=={1}'.format(os.getpid(),time.ctime()))
            time.sleep(self.y)
if __name__ == '__main__':
    p = ClockProcess(5,1)
    p1= ClockProcess(5,1)
    p.start()
    p1.start()
    p.join()
    p1.join()

通过Process类创建实例,然后传函数创建进程,另一种是继承Process类,然后重写run()方法创建要执行的任务。

进程池 Pool(方法3)

from multiprocessing import Pool
import os

def clock(k):
    for i in range(k):
        print('{0}当前时间=={1}'.format(os.getpid(),time.ctime()))
        time.sleep(k)
if __name__ == '__main__':
    l = [1 for i in range(20)]# 列表推导出一个列表对象
    with Pool(5) as p:
        p.map(clock,l)

进程池方便创建多进程进行操作,创建使用也是比较简单的,使用时可以根据应用场景对线程的控制要求来选择线程的创建方式。

线程间的通信

Python为线程提供了Queue、Pipes等多种方式来交换数据,我们以Queue为例来演示学习一下进程间的通信及协作,稍后我们还要做分布式多进程的演示。

Queue进程间通信演示:

import multiprocessing as mp
import time, os
from queue import Queue

def prt_q(q):
    '''消费者打印数据'''
    while True:
        v = q.get()
        print(v)
        time.sleep(0.1)
def wrt_q(q):
    '''生产者添加数据'''
    for k in ['aa','bb','cc','dd','ee','ff','gg']:
        print("{0}已经加入到队列中".format(k))
        q.put(k)
        time.sleep(0.2)
if __name__ == '__main__':
    q = Queue()
    wrt_q(q)
    p = mp.Process(target=prt_q, args=(q,))
    p.start()
    p.join()

Queue的使用其实就是生产者与消费者的模式,上边的代码运行后会有死锁,请按ctrl+c强制停止程序运行。 Python的进程有个很强大的地方,就是通过简单的配置就可以进行分布式多进程,这点是很吸引人的,稍后我会有一个篇幅来介绍一下分布式多进程。

本文源码下载: