设为首页 加入收藏

TOP

Python学习——Python进程(三)
2017-10-09 13:49:37 】 浏览:2817
Tags:Python 学习 进程
ked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
 
get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常。
 1 import multiprocessing
 2 def writer_proc(q):
 3     try:
 4         q.put(1, block = False)
 5     except:
 6         pass
 7 
 8 def reader_proc(q):
 9     try:
10         print (q.get(block = False))
11     except:
12         pass
13 
14 if __name__ == "__main__":
15     q = multiprocessing.Queue()
16     writer = multiprocessing.Process(target=writer_proc, args=(q,))
17     writer.start()
18 
19     reader = multiprocessing.Process(target=reader_proc, args=(q,))
20     reader.start()
21 
22     reader.join()
23     writer.join()
24 
25 # 运行结果
26 # 1

6、Pipe

Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息。
 
send和recv方法分别是发送和接受消息的方法。例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError。

Pipe可以是单向(half-duplex),也可以是双向(duplex)。我们通过mutiprocessing.Pipe(duplex=False)创建单向管道 (默认为双向)。一个进程从PIPE一端输入对象,然后被PIPE另一端的进程接收,单向管道只允许管道一端的进程输入,而双向管道则允许从两端输入。

 1 # proc1 发送消息,proc2,proc3轮流接收消息
 2 import multiprocessing
 3 import time
 4 
 5 def proc1(pipe):
 6     while True:
 7         for i in range(100):
 8             print ("send: %s" %(i))
 9             pipe.send(i)
10             time.sleep(1)
11 
12 def proc2(pipe):
13     while True:
14         print ("proc2 rev:", pipe.recv())
15         time.sleep(1)
16 
17 def proc3(pipe):
18     while True:
19         print ("proc3 rev:", pipe.recv())
20         time.sleep(1)
21 
22 if __name__ == "__main__":
23     pipe = multiprocessing.Pipe()
24     p1 = multiprocessing.Process(target=proc1, args=(pipe[0],))
25     p2 = multiprocessing.Process(target=proc2, args=(pipe[1],))
26     p3 = multiprocessing.Process(target=proc3, args=(pipe[1],))
27 
28     p1.start()
29     p2.start()
30     p3.start()
31 
32     p1.join()
33     p2.join()
34     p3.join()
35 
36 # 运行结果
37 '''
38 send: 0
39 proc2 rev: 0
40 send: 1
41 proc3 rev: 1
42 send: 2
43 proc2 rev: 2
44 send: 3
45 proc3 rev: 3
46 send: 4
47 proc2 rev: 4
48 send: 5
49 proc3 rev: 5
50 send: 6
51 proc2 rev: 6
52 send: 7
53 proc3 rev: 7
54 send: 8
55 proc2 rev: 8
56 send: 9
57 proc3 rev: 9
58 send: 10
59 proc2 rev: 10
60 ......
61 '''

7、Pool
在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行它。

使用进程池(非阻塞)

 1 import multiprocessing
 2 import time
 3 
 4 def func(msg):
 5     print ("msg:", msg)
 6     time.sleep(3)
 7     print ("end")
 8 
 9 if __name__ == "__main__":
10     pool = multiprocessing.Pool(processes = 3)   # 池中最大进程数为3
11     for i in range(10):
12         msg = "hello %d" %(i)
13         pool.apply_async(func, (msg, ))   #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
14 
15     print ("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")
16     pool.close()
17     pool.join()   #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
18     print ("Sub-process(es) done.&qu
首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ruby之gem install 下一篇我的Python开发之路---微信网页授..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目