Python3并发编程之多进程

import multiprocessing
import logging
import importlib
importlib.reload(logging)
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s [%(processName)s] %(message)s')
# 环境(包配置)

 多进程与多线程差不多:

p = multiprocessing.Process(target=worker, name='worker')
p.start()
<<2017-03-12 11:12:01,028 INFO [worker] worker

与多线程不同的:

p.pid # 进程唯一标识符pid
25951
p.exitcode # 进程退出
0
p.terminate() # 杀死进程
# 每个进程会启动一个解释器,所以进程的代价比线程要高
    通讯方式不一样

由于多进程跨解释器的,所以进程的通讯 数据需要序列化

GIL对多进程无效,内置容器不是进程安全的,queue.Queue也不是进程安全的

    Manager管理(wait_change)
from multiprocessing import Manager
mgr = Manager()
d = mgr.dict()
mgr.list()
<ListProxy object, typeid 'list' at 0x7fde504d1be0>
mgr.Namespace()
<NamespaceProxy object, typeid 'Namespace' at 0x7fde504d1d30>
ns = mgr.Namespace()
ns.f = 3
# 多进程环境,尽量避免数据交互。数据经过序列号和反序列号,有代价
# master -> worker模式交互数据

多线程和多进程的选择

  • CPU密集型用多进程,可以充分利用CPU
  • IO密集型用多线程,减少序列号/反序列化

     请求/应答 这种模型,更多时候是结合使用的

    通常由master进程接收请求,分发给多个worker进程处理,worker中再用线程来进一步分发

线程池(change_wait) to multiThread

转载于:https://my.oschina.net/charlock/blog/857197

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值