python中多进程简介

1. 进程的状态

工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态

  • 就绪态:运行的条件都已经慢去,正在等在cpu执行
  • 执行态:cpu正在执行其功能
  • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态

2.多进程的使用

from multiprocessing import Process
p = Process(target=func, args=(x,))   # 创建进程  target=函数名   args=函数的参数

multiprocessing.current_process()   # 查看当前执行的进程
multiprocessing.current_process().pid   查看当前执行的进程编号

os.getpid()   # 进程编号  

os.getppid()  # 父进程编号
p.daemon = True   # 主进程守护  主进程结束,程序结束
p.start()   #  启动进程

p.terminate()   # 不管任务是否完成,立即终止子进程

p.join()    # 进程同步(一个进程执行任务完成 下个进程再执行任务)

3.多进程中全局变量是不能资源共享的

4.进程间通信-Queue

初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头);

  • Queue.qsize():返回当前队列包含的消息数量;

  • Queue.empty():如果队列为空,返回True,反之False ;

  • Queue.full():如果队列满了,返回True,反之False;

  • Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;

1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出"Queue.Empty"异常;

2)如果block值为False,消息列队如果为空,则会立刻抛出"Queue.Empty"异常;

  • Queue.get_nowait():相当Queue.get(False);

  • Queue.put(item,[block[, timeout]]):将item消息写入队列,block默认值为True;

1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出"Queue.Full"异常;

2)如果block值为False,消息列队如果没有空间可写入,则会立刻抛出"Queue.Full"异常;

  • Queue.put_nowait(item):相当Queue.put(item, False)
import multiprocessing


# 任务1
def write(queue):
    for i in range(10):
        # 判断容量是否满了
        if queue.full():
            print("满了")
            break
        print("write:", i)
        queue.put(i)

# 任务2
def read(queue):
    for i in range(10):
        # 判断如果容量空了
        if queue.empty():
            print("空了")
            break
        print("read:", queue.get())

if __name__ == '__main__':
    # 创建消息队列
    # 注意 在linux系统可以写在上面 但是windows是不可以的
    queue = multiprocessing.Queue(5)
    # 创建进程 -> 新建状态
    write_process = multiprocessing.Process(target=write, args=(queue,))
    read_process = multiprocessing.Process(target=read, args=(queue,))
    # 启动进程 就绪状态
    write_process.start()
    # 进程同步
    write_process.join()
    read_process.start()

5.进程池Pool

multiprocessing.Pool常用函数解析:

  • apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
  • close():关闭Pool,使其不再接受新的任务;
  • terminate():不管任务是否完成,立即终止;
  • join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;
import multiprocessing, time

# 复制任务
def copy_work():
    print(multiprocessing.current_process().pid)
    print("正在复制...")
    time.sleep(0.1)

if __name__ == '__main__':

    # 创建进程池
    # Pool(进程数量)
    pool = multiprocessing.Pool(3)

    for i in range(10):
        # 使用进程池中的进程执行任务
        pool.apply_async(copy_work)

    # 固定用法(在主进程等待前 需要关闭进程池 不再接收新的任务)
    pool.close()

    # 保证主进程堵塞(等待)
    pool.join()

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值