获取进程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是自己写的模块,可以参考文章:
进程池
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 """