Python基于进程的并发编程

from multiprocessing import Process, Pipe, Queue
import os
from 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的测试完毕。。。。。。")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值