愚公移山日记·25

愚公移山日记·25

学习进程

今天学习的是多进程在此之前我也对于多进程有过相关的了解,也学习过多线程,今天系统的去学习多进程还是有很多的收获,今天也认识到一条很重要的道理,就是不要总想着去把一个库的内容全部熟练的学会,只要知道有这总功能,到用的时候再去百度就可以。

多任务是同一时间多个任务,而python默认是单任务,所以要用多线程或者多进程去更快的解决问题。线程的执行顺序是无序的线程由cpu调度cpu会根据系统运行状态按照自己的调度算法去调度执行。
回顾一下我之前学习的多线程的内容:
threading.enumerate()获取当前活跃的线程列表对象
threading.current_thread()获取当前得到线程对象,对象中含有的名称

多进程也是完成多个任务的一种方式,进程是资源调度的最小的单位,也是线程的容器。
进程的状态:新建,就绪,运行,死亡以及再就绪与运行之间的等待。
进程使用的步骤一般分为三步:

  1. 导入模块
  2. 创建子进程对象
  3. 启动子进程
#导入模块
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()

变量能够给子进程指定的参数传递
线程的参数传递方式:

  1. args 元组
  2. kwargs 字典
  3. 混合
'''
导入模块
通过模块提供的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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值