プロセスとマルチプロセス

5938 ワード

python同時プログラミングのプロセス
一、プロセス中の名詞はプログラムの中でどういう意味かをはっきりさせなければならない.
        :            ,             .

  :                    .

***(      :         ,       )***

同時および並列
  :    ,         ,  cpu+           ,(       )

  :    ,      cpu      

同期と非同期:
    :            ,               ,      。

    :            ,               ,       ,       ,         ,          

プロセスの作成
Multiprocessingモジュールの紹介
multiprocess       :     ,       ,         ,   process、Queue、Lock   。

マルチプロセスの作成
       :  (      )          (  )
	from multiprocssing import Process
	import time
	
	#1.  (      )
	
	def foo(i):
		print("say hi", i )
	if __name__ =="__main__":
		for i in range(10):
			p1 = Process(target=foo, args=(i,))
			p2 = Process(target=foo, args=(i,))
			p1.start()
			p2.start()
			
	#2         (Process  )
	class MyProcess(Process):
		def __init__(self,arg):
			super(MyProcess,self).__init__()
			self.arg = arg
			
		def run(self):
			print("say hi", i)
			time.sleep(1)
		
		if __name__=="__main__":
			for i in range(10):
				p1 = MyProcess(i)
				p2 = MyProcess(i)
				p1.start()        #start     run
				p2.start()

daemonプログラム比較結果
#  daemon    
def foo(i):
    '''
         :          
    :param i:
    :return:
    '''
    print("say hi", i)

if __name__ =="__main__":
     for i in range(2):
         p = multiprocessing.Process(target=foo,args=(i,))          #target --      
         p.start()                                                  #start  --    
         print("end")

#  :
    end
    say hi 0
    say hi 1
=========================================================================================
# daemon    
def foo(i):
    '''
         :          
    :param i:
    :return:
    '''
    print("say hi", i)

if __name__ =="__main__":
     for i in range(10):
         p = multiprocessing.Process(target=foo,args=(i,))          #target --      
         p.daemon = True                                            #    
         p.start()                                                  #start  --    
         print("end")

#  :
    end                            :        daemon  ,     ,        
=========================================================================================
# daemon        
def foo(i):
    '''
         :          
    :param i:
    :return:
    '''
    print("say hi", i)

if __name__ =="__main__":
     for i in range(2):
         p = multiprocessing.Process(target=foo,args=(i,))          #target --      
         p.daemon = True                                            #    
         p.start()                                                  #start  --    
         p.join()                              #join()                   
         print("end")

#  :
    say hi 0
    say hi 1
    end

プロセス(ロック)
         ,           ,         ,        ,     ,           ,    ,      
import multiprocessing
import sys
def worker_with(lock, f):
    with lock:                       # #with Lock              (  )
        fs = open(f, 'a+')
        n = 10
        while n > 1:
            fs.write("Lockd acquired via with
") n -= 1 fs.close() ''' with lock lock.acquire() lock.release() ''' def worker_no_with(lock, f): lock.acquire() try: fs = open(f, 'a+') n = 10 while n > 1: fs.write("Lock acquired directly
") n -= 1 fs.close() finally: lock.release() if __name__ == "__main__": lock = multiprocessing.Lock() f = "file.txt" w = multiprocessing.Process(target=worker_with, args=(lock, f)) nw = multiprocessing.Process(target=worker_no_with, args=(lock, f)) w.start() nw.start() print("end")

プロセスプール:
# :     (   ,apply_async)
#coding: utf-8
from multiprocessing import Process,Pool
import time

def func(msg):
    print( "msg:", msg)
    time.sleep(1)
    return msg

if __name__ == "__main__":
    pool = Pool(processes = 3)
    res_l=[]
    for i in range(10):
        msg = "hello %d" %(i)
        res=pool.apply_async(func, (msg, ))   #          processes,                   
        res_l.append(res)
    print("==============================>") #     join, get,       ,                             

    pool.close() #     ,       。          ,             
    pool.join()   #  join  ,   close  ,     。   close           pool,join           

    print(res_l) #           ,       ,      join    ,          ,               get       
    for i in res_l:
        print(i.get()) #  get   apply_aync   ,   apply,   get  ,  apply     ,      ,     get

# :     (  ,apply)
#coding: utf-8
from multiprocessing import Process,Pool
import time

def func(msg):
    print( "msg:", msg)
    time.sleep(0.1)
    return msg

if __name__ == "__main__":
    pool = Pool(processes = 3)
    res_l=[]
    for i in range(10):
        msg = "hello %d" %(i)
        res=pool.apply(func, (msg, ))   #          processes,                   
        res_l.append(res) #    ,          ,        
    print("==============================>")
    pool.close()
    pool.join()   #  join  ,   close  ,     。   close           pool,join           

    print(res_l) #               
    for i in res_l: #apply    ,        ,  get()  
        print(i)

  :apply_async apply

  :apply_async apply