愚公移山日记·25
学习进程
今天学习的是多进程在此之前我也对于多进程有过相关的了解,也学习过多线程,今天系统的去学习多进程还是有很多的收获,今天也认识到一条很重要的道理,就是不要总想着去把一个库的内容全部熟练的学会,只要知道有这总功能,到用的时候再去百度就可以。
多任务是同一时间多个任务,而python默认是单任务,所以要用多线程或者多进程去更快的解决问题。线程的执行顺序是无序的线程由cpu调度cpu会根据系统运行状态按照自己的调度算法去调度执行。
回顾一下我之前学习的多线程的内容:
threading.enumerate()获取当前活跃的线程列表对象
threading.current_thread()获取当前得到线程对象,对象中含有的名称
多进程也是完成多个任务的一种方式,进程是资源调度的最小的单位,也是线程的容器。
进程的状态:新建,就绪,运行,死亡以及再就绪与运行之间的等待。
进程使用的步骤一般分为三步:
- 导入模块
- 创建子进程对象
- 启动子进程
#导入模块
import multiprocessing
import time
def work1():
for i in range(10):
print('正在运行work1....')
time.sleep(0.5)
if __name__ == '__main__':
# 导入模块
# 通过模块提供的process类创建进程对象
process_obj = multiprocessing.Process(target=work1)
# 启动进程
process_obj.start()
变量能够给子进程指定的参数传递
线程的参数传递方式:
- args 元组
- kwargs 字典
- 混合
'''
导入模块
通过模块提供的process类创建进程对象
启动进程
'''
import multiprocessing
import time
def work1(a, b, c):
print('参数', a, b, c)
for i in range(10):
print('正在运行work1....')
time.sleep(0.5)
if __name__ == '__main__':
# 导入模块
# 通过模块提供的process类创建进程对象
# 参数的传递由三种方式
# 使用args传递元组
# 使用kwarg传递字典
# 混合使用args和kwargs
# process_obj = multiprocessing.Process(target=work1, args=(10, 100, 10000))
process_obj = multiprocessing.Process(target=work1, args=(10, ),kwargs= {'c':1,'b':100})
# process_obj = multiprocessing.Process(target=work1, kwargs={'c':10, 'a':100, 'b':10000})
# 启动进程
process_obj.start()
进程与线程的对比
- 线程不能独立运行,线程必须依靠进程。
- 进程是资源分配的基本单位,线程是cpu调度的基本单位
- 进程需要独立的内存资源,线程需要的是是必不可少的一点资源
- 进程切换慢,线程切换更快
- cpu密集型进程优先,i/o密集型使用线程
- 程序更稳定进程,线程的稳定性不好
数据的传递
'''
队列是multiprocessing模块提供的一个类
创建队列
放值
取值
'''
import multiprocessing
#创建队列
#队列是multiprocessing模块提供的一个类
#multiprocessing.Queue(n)表示队列的长度。
queue = multiprocessing.Queue(5)
# 放值
# queue.put(值)
queue.put(1)
queue.put('hello')
queue.put([1, 2, 3])
queue.put((1, 3, 4))
queue.put({'a': 3, 'f': 4})
# 长度为五,当第六个数据进入后,队列进入阻塞状态,默认会等待队列先取出值再放入新的值
# queue.put_nowait()表示放入值,如果已满不再等待,直接报错
# 取值
vaule = queue.get()
print(vaule)
print('__' * 20)
vaule = queue.get()
print(vaule)
print('__' * 20)
vaule = queue.get()
print(vaule)
print('__' * 20)
vaule = queue.get()
print(vaule)
print('__' * 20)
# ------队列已经没有值了--------
# 当对队列已经空的时候,在这get程序进入阻塞状态,等待放入新的值到队列,然后再取。
# vaule = queue.get()
# print(vaule)
# print('__' * 20)
# get_nowait()当队列已空,不会等待放入新的值
vaule = queue.get_nowait()
print(vaule)
print('_____'*10)