zoukankan      html  css  js  c++  java
  • Python的学习之旅———锁,递归锁 守护进程 manger().Lock

    守护进程

    1  p=Process(target=task,)
    2  p.daemon = True #必须在p.start()前设置
    3  p.start()
    4  time.sleep(1)
    5  # p.join()
    6  print('')

    守护进程是守护主进程,主进程死掉了,守护进程也就结束了。


    1:守护进程到底什么时候死?:2做完
    2:主进程到底什么时候算执行完毕:主进程运行完毕最后一行代码
    3:主进程什么时候应该死掉:等到所有的非守护的子进程都死掉,主才死
    4:主进程执行完毕了,是否意味着主进程会立马死掉? 否
    守护进程内不能再开子进程 会造成僵尸进程

    锁 (互斥锁)

    from multiprocessing import Process,Lock
    lock=Lock
    lock.acquire()
    lock.release()

    使用的时候需要将锁传给子进程。(不传的话就是生成了很多个锁)

    支持上下文管理协议

    1 with lock:

    2 search()

    3 get() 

    解决方法,递归锁,在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。

    这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

    mutexA=mutexB=threading.RLock() #一个线程拿到锁,counter加1,该线程内又碰到加锁的情况,
    则counter继续加1,这期间所有其他线程都只能等待,等待该线程释放所有锁,即counter递减到0为止
    p

    Manger().Lock  有个问题对于子进程而言 进程内的数据是不共享的,所以我们如果想在开启多进程的时候修改一个公共数据 ,只能使用 文件的方式,无法使用Lock 。这个时候我们就需要共享一块内存了

    Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。

  • 相关阅读:
    Centos开启FTP及用户配置
    mysql update from 子查询
    sql server 查询表某个字段不重复数据
    ASP.NET 获取来源网站的网址,获取上一网页的网址,获取来源网页的URL,获取上一网页的URL
    Warning: Invalid argument supplied for foreach()
    不支持关键字: “userid”。
    apache301重定向设置
    service httpd restart失败解决方法(小记)
    JavaWeb(一)
    jquery中filter的用法
  • 原文地址:https://www.cnblogs.com/surehunter/p/7890400.html
Copyright © 2011-2022 走看看