进程中的 join 方法、数据隔离、开启进程的第二种方式

# join 方法

# 5000封邮件群发
# 比如发一封要0.1s 那么发完也只需500s
# 但是如果不想这么久,就可以使用进程
# 50个进程=10封邮件
# 结论:所有的邮件已经发送完毕

from multiprocessing import Process

def send_mail(n):
    print("发送邮件%s" % n)

if __name__ == "__main__":
    p = Process(target=send_mail, args=(1,))
    p.start()
    p.join()  # 阻塞,直到子进程执行结束
    print("所有的邮件都发送完了")

# 发送邮件1
# 所有的邮件都发送完了
# 使用join()能够保证先打印 发送邮件,再打印 所有的邮件都发送完了
# 同步发送邮件

from multiprocessing import Process

def send_mail(n):
    print("发送邮件%s" % n)

if __name__ == "__main__":
    for i in range(10):
        p = Process(target=send_mail, args=(i,))
        p.start()
        p.join()
    print("所有的邮件都发送完了")

# 发送邮件0
# 发送邮件1
# 发送邮件2
# 发送邮件3
# 发送邮件4
# 发送邮件5
# 发送邮件6
# 发送邮件7
# 发送邮件8
# 发送邮件9
# 所有的邮件都发送完了
# 观察运行过程,发现使用join()后变成同步了
# 为了节省时间,应该让子进程运行的时候是异步的
from multiprocessing import Process

def send_mail(n):
    print("发送邮件%s" % n)

if __name__ == "__main__":
    l = []
    for i in range(10):
        p = Process(target=send_mail, args=(i,))
        l.append(p)
        p.start()
    for p in l:
        p.join()
    print("所有的邮件都发送完了")

# 发送邮件0
# 发送邮件2
# 发送邮件1
# 发送邮件3
# 发送邮件4
# 发送邮件5
# 发送邮件6
# 发送邮件7
# 发送邮件8
# 发送邮件9
# 所有的邮件都发送完了

# 这样就实现异步了,注意发现不是按顺序的


# 另外,注意这点:
from multiprocessing import Process
import time

print("这是函数外部")

def func():
    time.sleep(5)
    print("子进程开始运行")

if __name__ == "__main__":
    p = Process(target=func)
    print("这是在子进程启动之前")
    p.start()  # 子进程启动
    print(p.is_alive())
    p.join()  # 阻塞,等子进程先运行完主进程才能运行
    print(p.is_alive())
    print("主进程开始执行")

# 还是那句话,逐行执行
# 设置了时间延迟就先执行下面的代码,但是因为有join()
# 哪怕时间延迟有30min,主进程也得等子进程先运行
# 还有一点:
# windows在启动子进程的时候会将主进程文件导入到子进程中。
# 导入模块就相当于执行这个模块中的代码
# 所以第一个print会在主进程中执行一次,又在被导入的过程中在子进程中又执行了一次。
# 数据隔离

n = 100
def func():
    global n
    n -= 1

for i in range(100):
    func()
print(n)  # 0



from multiprocessing import Process
n = 100
def func():
    global n
    n -= 1

if __name__ == "__main__":
    p_list = []
    for i in range(100):
        p = Process(target=func)
        p.start()
        p_list.append(p)
    for p in p_list:
        p.join()
    print(n)  # 主进程

# 100 要等一会才会出结果,因为有join()

# 在进程之间数据是完全不能互通的

猜你喜欢

转载自www.cnblogs.com/shawnhuang/p/10323666.html
今日推荐