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() 解锁
- 锁优点:确保了数据代码的完整执行
- 缺点: 阻止了多线程并发执行,
网友评论