python进程和线程学习笔记

线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。

多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。

进程

  • 子进程调用getppid()可以拿到父进程的ID。

  • multiprocessing模块就是跨平台版本的多进程模块。multiprocessing模块提供了一个Process类来代表一个进程对象。from multiprocessing import Process

  • 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,这样创建进程比fork()还要简单。

  • join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。

  • 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。

  • Pool的默认大小:p = Pool(5)默认大小为5。

  • subprocess模块可以让我们非常方便地启动一个子进程,然后控制其输入和输出。

  • communicate()方法输入。

  • Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。

  • 由于Windows没有fork调用,因此,multiprocessing需要“模拟”出fork的效果,父进程所有Python对象都必须通过pickle序列化再传到子进程去,所有,如果multiprocessing在Windows下调用失败了,要先考虑是不是pickle失败了。

  • 小结:
    在Unix/Linux下,可以使用fork()调用实现多进程。

    要实现跨平台的多进程,可以使用multiprocessing模块。

    进程间通信是通过Queue、Pipes等实现的。

线程

_thread和threading(常用),_thread是低级模块,threading是高级模块,对_thread进行了封装。

  • Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。

  • 多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享。线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。

  • Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。多线程的并发在Python中就是一个美丽的梦。

你可能感兴趣的:(Python)