文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python之多进程multiproce

2023-01-31 06:39

关注


一:multiprocess基本使用

    multiprocessing是要比fork更高级的库了,使用multiprocessing可以更加轻松的实现多进程程序。multiprocessing也提供了很多进程同步和进程通信的方法。

    

#!/usr/bin/env python
import multiprocessing
import time
def clock(interval):
        while True:
                print "The time is {0}".format(time.ctime())
                time.sleep(interval)
if __name__ == "__main__":
        for i in range(3):
                p = multiprocessing.Process(target=clock,args=(1,))
                p.start()
                p.join()

    join()代表启动多进程,但是阻塞并发运行,一个进程执行结束后再执行第二个进程。可以给其设置一个timeout值比如join(5)代表5秒后无论当前进程是否结果都继续并发执行第二个进程。


二:进程同步

    对于一些互斥的资源来说,进程间需要进程互斥来访问。否则导致资源访问受阻,或者最后的结果混乱等情况。对于标准输出这个资源来说,如果多个资源同属输出信息,可能会导致输出的信息混乱。所以需要使用锁来避免资源互斥访问。

from multiprocessing import Process,Lock
def f(l,i):
       l.acquire()
       print "hello world",i
       l.release()

if __name__ == "__main__":
        lock = Lock()
        for num in range(10):
                Process(target=f,args=(lock,num)).start()


三:进程通信

    两个进程直接运行的时候如果希望可以让进程间通信的话是需要借助multiprocessing中的一些机制来实现。

一:方式一Queue

from multiprocessing import Process,Queue

def f(q):
        q.put([1,2,3,4])

if __name__ == '__main__':
        q = Queue()
        p = Process(target=f,args=(q,))
        p.start()
        print q.get()
        p.join()

二:方式二Pipe

#/usr/bin/env python
from multiprocessing import Process, Pipe
def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()
if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())


四:进程共享变量

    几个进程之间的都拥有自己独立的命名空间和地址空间,无法通过一些全局变量来实现,multiprocessing提供了一些特殊的函数来实现共享变量。

1.Value,Array的方式

from multiprocessing import Process,Value,Array
def f(n,a):
        n.value = 3.1415926
        for i in range(len(a)):
                a[i] = -a[i]
if __name__ == "__main__":
        num = Value('d',0.0)
        arr = Array('i',range(10))
        p = Process(target=f,args=(num,arr))
        p.start()
        p.join()
        print num.value
        print arr[:]

    Value()和Array()都有两个参数第一个参数代表存放的值的类型,第二个参数代表其值。


2.Manager的方式

    这个方式支持的类型更多,灵活性更大,但是速度要慢于Value,Array。

from multiprocessing import Process,Manager
def f(d,l):
        d[1] = '1'
        d['2'] = 2
        d[0.25] = None
        l.reverse()
if __name__ == "__main__":
        manager = Manager()
        d = manager.dict()
        l = manager.list(range(10))
        p = Process(target=f,args=(d,l))
        p.start()
        p.join()
        print d
        print l

五:Pool的使用

   

from multiprocessing import Pool
def f(x):
    return x*x
if __name__ == '__main__':
    pool = Pool(processes=5)
    result = pool.apply_async(f, [10])
    print result.get(timeout=1)
    print pool.map(f, range(10))

pool常用的函数有:

apply 开启多个进程并发执行

apply_async 同上,但是这个是异步的,非阻塞的。

map 类似于内建函数map,后面提供的参数列表会一个一个应用于函数,。这里会开发多个进程并发一起执行。

map_async 和map相同,只不过这是一个异步的,不会阻塞等待结果。该函数会返回一个结果对象。


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯