python3 系统编程——进程

使用process模块创建进程

from multiprocessing import Process

def f(name):
    print('hello', name)
    print('我是子进程')

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    time.sleep(1)
    print('执行主进程的内容了')
  • 在windows使用该模块需要在if name ==‘main’里面,不然会报错
  • args=(‘bob’,) 传递参数时使用的,注意只有一个参数是要有逗号。p.start() 才使子进程开始运行
  • 模块multiprocess中创建了子进程完,父进程会等所有子进程都运行完,才结束
  • 正常创建子进程后主进程不会阻塞,但是可以使用代码p.join()会等到子进程结束后,再向下执行代码,p.join(10) 10代表超时时间,超过10秒就不等了,就等于程序把异步变成同步
  • 多进程之间数据参数是完全隔离的,各自使用各自的,注意子进程里面不能使用input

进程锁

  • 在编程中对某段代码加个锁,同一时间就只能单个进程可以执行这段代码,目的就是为了防止 一些硬盘IO时产生超买超卖的现象。多在共享存储时,数据库操作时
# 从模块中引入锁
from multiprocessing import Lock
# 创建一把锁
lock = Lock()
# 在需要加锁的函数参数中传入一个参数,lock,然后在函数体最上面加,就是拿钥匙进门
lock.acquire()
# 在函数最后加入lock.release,还钥匙
lock.release()

信号量

  • 同一段代码同一时间只能限制一些人使用,进程锁限定只能一个人使用,信号量与其对应,可以限定多少个人使用
from multiprocessing import Semaphore
# 创建信号器数量(4把钥匙)为4
sema = Semaphore(4)
# 同进程锁,在需要限定使用的函数头加sema.acquire(),进程拿走一把钥匙
sema.acquire()
# 尾部加
sema.release()

事件

from multiprocessing import Event
# 创建一个事件
event = Event()

# 判断事件的状态,默认创建事件时候是阻塞的,就是false
event.is_set()

# wait方法是根据状态决定是否阻塞下面的代码  
event.wait()

# 设置事件状态为true
event.set()

# 清除事件状态,改为默认
event.clear()

# 实例

inter-Process Community 进程间通信

  • 队列Queue,先进先出
  • queue.put() 把数据放入队列
  • queue.get() 把数据从队列中取出
  • queue.full() 判断队列是否满了
  • queue.empty() 判断队列是否空了
from multiprocessing import Queue
queue = Queue

进程池

from multiprocessing import Pool
# 创建进程池,里面有5个进程
pool = Pool(5)

for temp in range(10):
# 异步创建任务用applay_async
	pool.applay_async(func,args=(i,))
# 关闭进程池,表示不能在往进程池中添加进程
pool.close()
# 等待进程池中的所有进程执行完毕,必须在close()之后调用
pool.join()
  • 进程池的效率明显高于单独一个一个创建进程,因为创建进程需要消耗大量的时间,而进程池是完成一个任务后,继续使用该进程执行下一个任务。进程池一样要写在if name == "main"底下
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值