多进程
import multiprocessing
import time
def func(arg):
pname = multiprocessing.current_process().name
pid = multiprocessing.current_process().pid
print("当前进程ID=%d,name=%s" % (pid, pname))
for i in range(5):
print(arg)
time.sleep(1)
if __name__ == "__main__":
p = multiprocessing.Process(target=func, args=("hello",))
p.start()
while True:
print("子进程是否活着?", p.is_alive())
time.sleep(1)
print("main over")
继承Process自定义进程
import multiprocessing
import os
class MyProcess(multiprocessing.Process):
def __init__(self, name, url):
super().__init__()
self.name = name
self.url = url
def run(self):
pid = os.getpid()
ppid = os.getppid()
pname = multiprocessing.current_process().name
print("当前进程name:", pname)
print("当前进程id:", pid)
print("当前进程的父进程id:", ppid)
if __name__ == '__main__':
MyProcess("小分队1", "").start()
MyProcess("小分队2", "").start()
print("主进程ID:", multiprocessing.current_process().pid)
coreCount = multiprocessing.cpu_count()
print("我的CPU是%d核的" % coreCount)
print(multiprocessing.active_children())
同步异步和进程锁
import multiprocessing
import random
import time
def fn():
name = multiprocessing.current_process().name
print("开始执行进程:", name)
time.sleep(random.randint(1, 4))
print("执行结束:", name)
def processAsync():
p1 = multiprocessing.Process(target=fn, name="小分队1")
p2 = multiprocessing.Process(target=fn, name="小分队2")
p1.start()
p2.start()
def processSync():
p1 = multiprocessing.Process(target=fn, name="小分队1")
p2 = multiprocessing.Process(target=fn, name="小分队2")
p1.start()
p1.join()
p2.start()
p2.join()
def processLock():
lock = multiprocessing.Lock()
p1 = multiprocessing.Process(target=fn2, name="小分队1", args=(lock,))
p2 = multiprocessing.Process(target=fn2, name="小分队2", args=(lock,))
p1.start()
p2.start()
def fn2(lock):
name = multiprocessing.current_process().name
print("开始执行进程:", name)
if lock.acquire():
print("正在工作...")
time.sleep(random.randint(1, 4))
lock.release()
with lock:
print("%s:正在工作..." % name)
time.sleep(random.randint(1, 4))
print("%s:执行结束:"% name)
if __name__ == '__main__':
processLock()
使用Semaphore控制进程的最大并发
import multiprocessing
import time
def fn(sem):
with sem:
name = multiprocessing.current_process().name
print("子线程开始:", name)
time.sleep(3)
print("子线程结束:", name)
if __name__ == '__main__':
sem = multiprocessing.Semaphore(3)
for i in range(8):
multiprocessing.Process(target=fn, name="小分队%d"%i, args=(sem, )).start()