Python基于进程的并发编程

来源:互联网 发布:abp zero 源码 下载 编辑:程序博客网 时间:2024/06/06 05:14
from multiprocessing import Process, Pipe, Queueimport osfrom time import sleep, ctime"""在multiprocessing库里面,是通过创建Process对象并调用start()方法来创建进程。同threading.Thread具有相同的方法。比如:run(), start(), join()"""def f(name):    info("函数F开始运行的地方。。。。。")    for i in range(5):        print("......hello", name)        sleep(1)# 打印进程信息def info(title):    print(title)    print("模块名称 :", __name__)    if hasattr(os, 'getppid'):        print("父进程 :", os.getppid(), "子进程:", os.getpid())    else:        print("父进程 :未知,   子进程:", os.getpid())#pipe的使用"""    Pipe()返回两个连接对象,代表Pipe的两端    这两个连接对象都有send()和recv()方法。    Pipe是不线程安全的,    如果两个及以上的线程同时从Pipe的一端进行读写,则Pipe的数据可能遭到破坏。    """def process1(conn):    for i in range(10):        conn.send('进程1发送的第%d条数据' %(i+1))      # 发送数据。        print("进程1接收到的数据:", conn.recv())        sleep(0.5)def process2(conn):    for i in range(10):        conn.send('进程2发送的第%d条数据' %(i+1))      # 发送数据。        print("进程2接收到的数据:", conn.recv())        sleep(0.5)#Queue的使用"""Queue几乎是queue.Queue的克隆版本Queue是线程和进程安全的。"""def procQueue1(q):    for i in range(10):        q.put('进程1发送的第%d条数据' % (i + 1))  # 发送数据。        sleep(0.5)def procQueue2(q):    for i in range(20):        q.put('进程2发送的第%d条数据' % (i + 1))  # 发送数据。        sleep(0.5)def procQueue3(q):    print("。。。先显示5条数据")    count = 0    for i in range(5):        count = count + 1        print("进程3接收到的第%d条数据:" %(count),q.get())        sleep(0.5)    print("。。。剩余的数据全部显示完以后就退出")    while not q.empty():        count = count + 1        print("进程3接收到的第%d条数据:" % (count), q.get())        sleep(0.5)if __name__ == '__main__':    p = Process(target=f, args=('Bob',), kwargs={})    p.start()    p.join()    print("。。。。。。开始管道Pipe的测试。。。。。。")    parentConn, childConn = Pipe()    p1 = Process(target=process1, args=(parentConn, ))    p2 = Process(target=process2, args=(childConn, ))    p1.start()    p2.start()    p1.join()    p2.join()    print("。。。。。。Pipe管道测试完毕。。。。。。")    print()    print("。。。。。。开始队列Queue的测试。。。。。。")    q = Queue()    p1 = Process(target=procQueue1, args=(q,))    p2 = Process(target=procQueue2, args=(q,))    p3 = Process(target=procQueue3, args=(q,))    p1.start()    p2.start()    p3.start()    p1.join()    p2.join()    p3.join()    print("。。。。。。队列Queue的测试完毕。。。。。。")