码迷,mamicode.com
首页 > 其他好文 > 详细

multiprocessing

时间:2016-08-11 20:51:43      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:

multiprocessing

创建进程的类:Process([group [, target [, name [, args [, kwargs]]]]]),target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。name为别名。group实质上不使用。

方法:is_alive()、join([timeout])、run()、start()、terminate()。其中,Process以start()启动某个进程。

属性:authkey、daemon(要通过start()设置)、exitcode(进程在运行时为None、如果为–N,表示被信号N结束)、name、pid。其中daemon是父进程终止后自动终止,且自己不能产生新进程,必须在start()之前设置。


将进程定义为类
import multiprocessing
import time

class ClockProcess(multiprocessing.Process):
    def __init__(self, interval):
        multiprocessing.Process.__init__(self)
        self.interval = interval

    def run(self):
        n = 5
        while n > 0:
            print("the time is {0}".format(time.ctime()))
            time.sleep(self.interval)
            n -= 1

if __name__ == ‘__main__‘:
    p = ClockProcess(3)
    p.start()
    print p.is_alive()

注:进程p调用start()时,自动调用run()



p.daemon = True
p.start()
p.join()


Lock
当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。
lock = multiprocessing.Lock()
lock.acquire()
lock.release()

Semaphore
Semaphore用来控制对共享资源的访问数量,例如池的最大连接数。

Event
Event用来实现进程间同步通信。

Queue
put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值)
get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常
q = multiprocessing.Queue()
try:         
    q.put(1, block = False) 
except:         
    pass  

try:         
    print q.get(block = False) 
except:         
    pass


Pipe
Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息。
pipe = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=proc1, args=(pipe[0],))
p2 = multiprocessing.Process(target=proc2, args=(pipe[1],))
pipe.send(i)
pipe.recv()


Pool
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。
pool = multiprocessing.Pool(processes = 3)
for i in xrange(4):
    msg = "hello %d" %(i)
    pool.apply_async(func, (msg, )) 


apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞,apply(func[, args[, kwds]])是阻塞的(理解区别,看例1例2结果区别)
close()    关闭pool,使其不在接受新的任务。
terminate()    结束工作进程,不在处理未完成的任务。
join()    主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用。


参考:http://www.cnblogs.com/kaituorensheng/p/4445418.html

 

multiprocessing

标签:

原文地址:http://www.cnblogs.com/lly-001/p/5762363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!