进程与线程6

线程和进程:

          进程:稳定,子进程挂,父进程没事,缺点:创造代价大,适合linux平台

          线程:不稳定,效率高。一个挂全挂。

多任务 :操作系统同时运行多个任务,

并发:看上去一起执行,任务数多于c pu核心数

并行:真正一起执行,任务数小于等于CPU核心数

实现多任务原理:

        多进程

        多线程,携程模式,多线程+多进程

 

 

 

进程:

    对于操作系统一个任务就是一个进程,进程是系统中程序执行和资源分配到基本单位

from multiprocessing import Process

    os.getpid()得到进程的id号,os.getppid()得到它父进程的ID号

p=Process(target=run,args=("",))

p.start()

子进程中修改全局变量,父进程不受影响

进程池:Pool库:

            pp=Pool()默认参数c pu核心数,指一次可以同时启动几个线程

      for i in rang(x):

                  p p.apply_async(run,args=(参数1,参数2))启动线程,统一管理

 

        pp.close() 然后pp.join()一定是close后再join(),调用close后就不能在有新的进程了

 

进程的2个重要方法:

 

join():父启-子启动-子结束-父结束,没有的话就是 父启-父结-子启

daemon()属性是否随主线程退出而退出如果类名.demon=true时它就不会随主线程的退出而退出

terminate()如果开启多个进程后,其中有一个进程无法关闭,陷入死循环就用它强行关闭

 

线程:在一个进程的内部,要同时干多件事,就需要同时运行多个字任务,我们把子任务称为线程

线程是最小的执行单元,而进程由至少一个线程组成。

 

线程支持资源共享,全局变量,所以,任何一个变量都可以被任意一个线程改变,从而线程共享就可能会造成

多个线程同时修改一个变量,从而值发生变化

 

 

 

死锁:多个并发进程因争夺系统资源而产生相互等待的现象。

锁的应用:

            2个线程同时工作,一个取钱,一个存钱,就可能会造成数据异常。解决方法:加锁

lock=      t h reading.lock()

锁:确保了一段代码只能由一个线程从头到尾的完整执行,阻止了多线程的并发执行,由于存在多个锁,不同的线程

持有不同的锁,并试图获取其它的锁,就会造成死锁,导致多个线程挂起,只能考系统强行终止

lock.acquire()加锁,lock.releas()释放锁

等同与:with lock:

                             执行的代码

 t=thread.Thread(target=,name="线程名称",)

thread.current_thread().name打印线程名字

t.join()等待线程结束

threading.Semphore(3)控制几个线程执行

threading.Timer(3,run)定时线程。3s后开始执行

生产者与消费者:

               生产者的线程在生产数,消费者的线程同时也在消费数,比如在一个队列中,一边的线程在生产,另一边的线程在消费

为什么要使用生产者消费者模型?

     在并发编程中,如果生产者处理速度很快,而消费者处理速度比较慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个等待的问题,就引入了生产者与消费者模型。让它们之间可以不停的生产和消费。

 

实现生产者消费者模型三要素:

    1、生产者

    2、消费者

    3、队列(或其他的容哭器,但队列不用考虑锁的问题)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值