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的测试完毕。。。。。。")
Python基于进程的并发编程
最新推荐文章于 2024-08-11 10:00:00 发布