python多进程

python的多线程不适合CPU密集型的任务,适合IO【文件读写,网络数据】密集型的任务

1.多进程

 

import multiprocessing
import time

def run(name):
    time.sleep(2)
    print('name', name)

if __name__ == '__main__':
    p = multiprocessing.Process(target=run, args=('bob', ))
    p.start()

 

 

获取进程ID:

  os.getppid()   --父进程

  os.getpid()   ---当前进程的id

 

进程间通信

利用中间件queue.Queue,可以实现线程间通信:

  q = queue.Queue()

  q.put(value)

  q.get()

利用中间件Queue实现进程通信:

from multiprocessing import Process, Queue
 
def f(q):
    q.put([42, None, 'hello'])
 
if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print(q.get())    # prints "[42, None, 'hello']"
    p.join() #等待进程结束

 

 

使用pipes实现进程通信:

  child_conn发送一次,parent_conn只能接受一次

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())   # prints "[42, None, 'hello']"  接受端
    p.join()

 

 

使用manager实现线程间数据共享

from multiprocessing import Process, Manager
 
def f(d, l):
    d[1] = '1'
    d['2'] = 2
    d[0.25] = None
    l.append(1)
    print(l)
 
if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
 
        l = manager.list(range(5))
        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()
 
        print(d)
        print(l)

 

转载于:https://www.cnblogs.com/zhuxiang1633/p/9377034.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值