プロセスとマルチプロセス
5938 ワード
python同時プログラミングのプロセス
一、プロセス中の名詞はプログラムの中でどういう意味かをはっきりさせなければならない.
同時および並列
同期と非同期:
プロセスの作成
Multiprocessingモジュールの紹介
マルチプロセスの作成
daemonプログラム比較結果
プロセス(ロック)
プロセスプール:
一、プロセス中の名詞はプログラムの中でどういう意味かをはっきりさせなければならない.
: , .
: .
***( : , )***
同時および並列
: , , 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