python 中的进程和线程

1. 进程和线程的区别:

  • 进程是操作系统的基本单位,而线程是任务调度和执行的基本单位
  • 每个进程都有独立的代码和数据空间
  • 同一类线程共享代码和数据空间
    在操作系统中能同时运行多个进程(程序):而在同一个进程中有多个线程同时执行
  • 进程可以分配内存空间,而线程除了CPU外系统不好为线程分配内存(线程所使用的资源来自于所属进程的资源)
  • 线程组之间能共享资源
  • 线程执行开销小,但不利于资源的管理和保护而进程正好相反
  • 没有运行的代码称为程序
  • 正在运行的代码称为进程
  • 进程除了包含代码外还包含代码的运行环境

2.fork() 在Linux下使用

  • os模块下的操作

  • python程序可以轻松的创建子进程(Linux下)

  • import os : 引入模块

  • os.fork() : 执行一次返回两次,操作系统把自己当做当前进程,然后在父进程和子进程内分别执行

  • 子进程返回0,父进程返回子进程的ID

  • gitpid , gitppid os模块下的

  • 得到自己的进程id,得到父进程的进程id

3.multiprocessing 在Windows下使用编写多进程

  • from multiprocessing import Process

  • import os

  • p = Process(target=fun)启动子进程

  • target: 表示进程实例所调用的对象

  • args: 表示调用对象的位置参数元组

  • kwargs: 表示调用对象的关键字参数字典

  • PROCESS常用方法:

  • p.start() 启动进程实例创建子进程

  • p.join() 等待子进程执行完成后再执行主进程,或等待多少秒

  • p.terminate() 立即终止程序

  • is_alive()判断进程是否还在执行

  • run() 如果对象没有给target参数,则执行对象中的run()方法

3.1进程池Pool()

  • apply() 阻塞
  • apply_async() 非阻塞
  • . join 阻塞进程 池子中所有子进程执行完成,再执行主进程,必须在close或terminate之后使用
  • .close() 停止外部继续使用池子进程
  • .terminate() 不管任务是否完成立即终止

3.2Queue() 队列

  • 用来在生产者和消费者线程之间的信息传递
  • 队列默认先进先出
  • put() 往队里里放数据 当队列放满时 默认一直等待
  • put_nowait() 直接放数据,队列满时直接结束不等待
  • get() 从队列开头取
  • get_nowait()

4. 多线程 threading

  • 一个进程内的线程可以共享全局变量
  • start() 启动多线程
  • threading.Thread(target=) 使用线程
  • threading.enumerate() 获取线程数
  • threading共享全局变量
  • global 使用全局的变量

4.1互斥锁

  • s = threading.Lock()
  • s.acquire() 默认blocking为True: 加锁,如果加
    锁不成功则阻塞知道加锁成功
  • s.release() 解锁
  • 锁优点:确保了数据代码的完整执行
  • 缺点: 阻止了多线程并发执行,

你可能感兴趣的:(python 中的进程和线程)