擷取程序id
import multiprocessing
import os
def foo():
print(__name__)
print("parent:", os.getppid())
print("current:", os.getpid())
if __name__ == "__main__":
foo() # 主程序調用
p = multiprocessing.Process(target=foo)
p.start() # 新開程序調用
"""
__main__
parent: 952
current: 188
__mp_main__
parent: 188
current: 6492
"""
多程序測試
import multiprocessing
import time, threading
from pycharm_fontcolor import Colors, FontColor
def func(i):
print(FontColor.set_color("線程号:{}".format(threading.get_ident()), Colors.green), i)
def foo(i):
print(FontColor.set_color("程序:", Colors.red), i)
t = threading.Thread(target=func, args=(i,)) # 程序中新開線程
t.start()
if __name__ == "__main__":
start_time = time.time()
for i in range(5):
p = multiprocessing.Process(target=foo, args=(i,))
p.start()
end_time = time.time()
print(FontColor.set_color("時間:", Colors.blue), end_time - start_time)
"""
時間: 0.05303597450256348
程序: 0
線程号:8968 0
程序: 1
線程号:7620 1
程序: 2
程序: 3
線程号:9204 2
線程号:2492 3
程序: 4
線程号:6512 4
"""
備注:
pycharm_fontcolor是自己寫的子產品,可以參考文章:
Python程式設計:pycharm控制台字型顔色程序池
from multiprocessing import Pool
import time, os
def foo(i):
time.sleep(2)
print("process:", i, os.getpid())
return i + 1 # 參數将傳遞給回調函數
def bar(i): # 做回調函數,由主程序執行
print("bar", i, os.getpid())
if __name__ == "__main__":
print(os.getpid())
pool = Pool(processes=3) # 允許同時放入3個程序
for i in range(10):
# p = pool.apply(func=foo, args=(i,)) # 串行
p = pool.apply_async(func=foo, args=(i,), callback=bar) # 并行
print("done")
pool.close() # 先關閉入口
pool.join() # 在等待執行
"""
8120
done
process: 0 5452
bar 1 8120
process: 1 8360
bar 2 8120
process: 2 7908
bar 3 8120
process: 3 5452
bar 4 8120
process: 4 8360
bar 5 8120
process: 5 7908
bar 6 8120
process: 6 5452
bar 7 8120
process: 7 8360
bar 8 8120
process: 8 7908
bar 9 8120
process: 9 5452
bar 10 8120
"""
程序隊列
from multiprocessing import Process, Queue
def foo(q):
q.put("你好")
if __name__ == "__main__":
q = Queue() # 程序隊列
p = Process(target=foo, args=(q,))
# p = Thread(target=foo, args=(q,))
p.start()
print(q.get()) # 你好
程序管道
from multiprocessing import Process, Pipe
def foo(conn):
conn.send("hello")
conn.close()
if __name__ == "__main__":
parent_conn, child_conn = Pipe() # 管道傳送資料
p = Process(target=foo, args=(child_conn,))
p.start()
print(parent_conn.recv()) # hello
多程序實作資料共享
from multiprocessing import Process, Manager
import os
def foo(dct, lst):
dct[os.getpid()] = os.getpid()
lst.append(os.getpid())
print(os.getpid())
if __name__ == "__main__":
manager = Manager() # 實作程序間共享資料
dct = manager.dict()
lst = manager.list()
processes = []
for i in range(5):
p = Process(target=foo, args=(dct, lst))
p.start()
processes.append(p)
for process in processes: # 等待結果
process.join()
print(dct)
print(lst)
"""
3816 5376 7500 8332 1124
{3816: 3816, 5376: 5376, 8332: 8332, 7500: 7500, 1124: 1124}
[3816, 5376, 7500, 8332, 1124]
"""
程序鎖
from multiprocessing import Lock, Process
def foo(lock, i):
lock.acquire()
print("hello world!", i)
lock.release()
if __name__ == "__main__": # 主動執行會繼續下面的内容,被當做子產品調用則不會
lock = Lock() # 執行個體化程序鎖
for i in range(5):
p = Process(target=foo, args=(lock, i))
p.start()
"""
hello world! 2
hello world! 1
hello world! 0
hello world! 3
hello world! 4
"""