zoukankan      html  css  js  c++  java
  • python多进程


    并发:是指系统具有处理多个任务(动作)的能力(CPU通过切换来完成并发),并发是并行的一个子集。

    并行:是指系统具有同时处理多个任务(动作)的能力

    进程与线程:

    一个任务就是一个进程,比如打开一个浏览器,打开一个qq 也是一个进程。 ,程序的所有数据资源都是存放在这里的。进程是最小的资源管理单元


    线程是基于进程的,一个进程至少有1个线程,代码是在线程中执行线程是最小的执行单元,比如你发消息,发送文件等操作,都是线程去操作的。

    线程是共享进程的内存单元的,所以多个线程实现资源共享。


    一个线程可以创建或撤销另外一个线程,那么这个线程被称为父线程。另

    同一个进程中的多个线程可以并发执行(存在cpu切换),不可以并行执行。这是因为,python存在全局解释器锁,在某个时刻,一个应用程序只有1个线程可以使用cpu。

    1,创建多进程

    import multiprocessing
    
    import threading
    
    
    import time
    
    
    def worker(id,interval):
        print('start work {0}'.format(id))
        time.sleep(interval)
        print('end work {0}'.format(id))
    
    
    def main():
        print('start main')
        p1  = multiprocessing.Process(target=worker,args=(1,1))
        p2  = multiprocessing.Process(target=worker,args=(2,2))
        p3  = multiprocessing.Process(target=worker,args=(3,3))
        p1.start()
        # print(p1.pid)
        p2.start()
        # print(p2.pid)
        p3.start()
        # print(p3.pid)
        print('end main')
    
    
    if __name__ == '__main__':
        main()
       
      
    '''

    target 指的是新派生出来的子进程需要处理的内容

    args 是给函数传入的参数,args必须是tuple.如果是传入单个元素,必须也是tuple.
    p代表的是一个多进程,run表示启动进程,start也是启动进程,他本质是调用run方法。建议使用start
    p.is_alive() 判断进程是否存活
    p.run() 启动进程
    p.name() 输出进程的名字
    p.pid() 进程的pid
    p.join(timeout) 等待子进程结束或者到超时时间
    p.terminate 强制子进程的退出

    '''

    import multiprocessing
    
    import threading
    
    
    import time
    
    
    def worker(id,interval):
        print('start work {0}'.format(id))
        time.sleep(interval)
        print('end work {0}'.format(id))
    
    
    def main():
        print('start main')
        p1  = multiprocessing.Process(target=worker,args=(1,1))
        p2  = multiprocessing.Process(target=worker,args=(2,2))
        p3  = multiprocessing.Process(target=worker,args=(3,3))
        p1.start()
        p1.join(1)  #等待p1进程执行1s,不管p1执行是否完毕,代码继续向下执行。
        p2.start()
        p3.start()
        for p in multiprocessing.active_children():  #查看当前存活的进程
            print(p.name)
    
        print('end main')
    
    
    if __name__ == '__main__':
        main()
    

     

    二,python多进程锁

    import multiprocessing
    
    import time
    
    # from multiprocessing import Lock
    
    
    
    def add2(lock,number,value):
        with lock:
            print('start add2')
            print('number is {0}'.format(number))
            for i in range(value):
              number+=value
              time.sleep(0.3)
              print('number is {0}'.format(number))
    
    def add3(lock,number,value):
          lock.acquire()
          try:
            print('start add3')
            print('number is {0}'.format(number))
            for i in range(value):
              number+=value
              time.sleep(0.3)
              print('number is {0}'.format(number))
          except Exception as e:
              raise e
          finally:
              lock.release()
    
    
    def main():
        lock = multiprocessing.Lock()
        p1 = multiprocessing.Process(target=add2,args=(lock,1,2))
        p2 = multiprocessing.Process(target=add3,args=(lock,1,3))
        p1.start()
        p2.start()
    
    if __name__ == '__main__':
    
        main()
    
    '''创建进程锁,如果不创建锁的话,输出的顺序比较乱'''
    

      

     三,多进程设置共享内存,A进程变量共享给B进程

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2018/5/21 下午11:39
    # @Author  : lin
    # @File    : daemon4.py
    
    import multiprocessing
    
    import time
    
    from multiprocessing import Value
    
    
    def add1(number,value):
        print('start add1')
        print('number is {0}'.format(number.value))
        for i in range(value):
          number.value+=value
          # time.sleep(0.3)
          print('number is {0}'.format(number.value))
    
    def add3(number,value):
        print('start add3')
        print('number is {0}'.format(number.value))
        for i in range(value):
            number.value+=value
          # time.sleep(0.3)
            print('number is {0}'.format(number.value))
    
    
    def main(): 
        p1 = multiprocessing.Process(target=add1,args=(number,1,))
        p2 = multiprocessing.Process(target=add3,args=(number,3,))
        p1.start()
        p2.start()
    
    if __name__ == '__main__':
        # 设置共享内存
        number=Value('d',0)
        main()
    

      

  • 相关阅读:
    页面实现的平滑效果
    CSS :hover 选择器
    AngularJS 路由
    [Leetcode] Container With Most Water
    [Leetcode] Minimum Path Sum
    [Leetcode] Unique Paths II
    [Leetcode] Unique Paths
    [Leetcode] Maximum Subarray
    [Leetcode] Binary Tree Postorder Traversal
    [Leetcode] Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/lin1/p/9068799.html
Copyright © 2011-2022 走看看