并发编程

Posted oxtime

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程相关的知识,希望对你有一定的参考价值。

join用法(等待子进程运行完)

from multiprocessing import Process
import time,os

def task(s):
    time.sleep(s)


if __name__ == '__main__':

    p1 = Process(target=task,args=(100,))
    p2 = Process(target=task,args=(2,))
    p3 = Process(target=task,args=(3,))

    p1.start()
    p2.start()
    p3.start()
    p1.join() # 等1s,
    p2.join() # 等1s,
    p3.join() # 等1s,内部会调用wait()
    print(p1.pid)
    print('子',p1.pid)
    print('主',os.getpid()) # 主进程要等待所有的子进程结束才会结束.因为主进程要在结束前回收僵尸进程.(*****)

terminate的用法(杀死进程)

    p = Process(target=foo)
    p.start()
    p.terminate() # 给操作系统发了一个请求  强行终止进程p 可能需要一点时间
    print(p.is_alive()) # True   is_alive() 判断子进程是否活着
    p.join()
    print(p.is_alive()) # False

daemon(守护进程)

if __name__ == '__main__':
    p = Process(target=task)
    p.daemon = True  ## 主进程结束,子进程也会结束
    p.start()
    time.sleep(2)
    print('主')    

进程锁 : 是把锁住的代码变成了串行

join 是把所有的子进程变成了串行

lock = Lock() # 写在主进程是为了让子进程拿到同一把锁.

Queue(队列)

q = Queue(n)  ##n是队列的容量
q.put('xxx') ##放数据
q.get()  ##拿数据
拿或者取的时候没有值时会卡住
q = Queue()
q.put_nowait('666') # block = False
print(q.get_nowait()) #666

JoinableQueue模块用法

from multiprocessing import Process,Queue,JoinableQueue


q = JoinableQueue()

q.put('zhao') # 放队列里一个元素 +1
q.put('qian')                 +1

print(q.get())
q.task_done() # 完成了一次任务 -1
print(q.get())
q.task_done() # 完成了一次任务 -1
q.join() #计数器不为0的时候 阻塞等待计数器为0后通过

# 想象成一个计数器 :put +1   task_done -1

以上是关于并发编程的主要内容,如果未能解决你的问题,请参考以下文章

Go语言学习之旅--并发编程

并发编程路线

java并发编程看啥书比较好

JAVA并发编程:并发编程的认识

并发编程的基础

Java并发编程之美