zoukankan      html  css  js  c++  java
  • 进程中的 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()
    
    # 在进程之间数据是完全不能互通的
  • 相关阅读:
    oracle 物化视图导入导出报错
    算法导论------------桶排序算法之研究
    实现一个做双向NAT的虚拟网卡
    合理的keyword密度散布与黑帽SEO之躲藏文本
    Java发送Email
    ubuntu系统下设置静态IP
    Design Pattern Iterator 迭代器设计模式
    概率论高速学习03:概率公理补充
    鄂尔多斯
    衬衫面料品牌:Alumo_衬衫_男装_男装:衬衫、法式衬衫、袖扣领带、西服西裤等男士正装服饰-仕族官网
  • 原文地址:https://www.cnblogs.com/shawnhuang/p/10323666.html
Copyright © 2011-2022 走看看