ÀÖÓãµç¾º

  • ½ÌÓýÐÐÒµA¹ÉIPOµÚÒ»¹É£¨¹ÉƱ´úÂë 003032£©

    È«¹ú×Éѯ/ͶËßÈÈÏߣº400-618-4000

    Python±à³ÌÖ®¶à½ø³Ì(multiprocessing)Ïê½â

    ¸üÐÂʱ¼ä:2023Äê04ÔÂ04ÈÕ10ʱ53·Ö À´Ô´:ÀÖÓãµç¾º ä¯ÀÀ´ÎÊý:

    ºÃ¿Ú±®ITÅàѵ

    ¡¡¡¡PythonÖеÄmultiprocessingÄ£¿éÌṩÁËÒ»ÖÖ´´½¨ºÍ¹ÜÀí½ø³ÌµÄ·½Ê½£¬Ê¹µÃ¿ÉÒÔÀûÓöà¸öCPUÀ´¼ÓËÙ³ÌÐòÔËÐС£ÔÚÕâÀÎÒ»áÏêϸ½éÉÜPythonÖÐµÄ¶à½ø³Ì±à³Ì£¬°üÀ¨ÒÔÏÂÄÚÈÝ£º

    ¡¡¡¡Ò».¶à½ø³Ì¸ÅÄî

    ¡¡¡¡¶þ.multiprocessingÄ£¿é½éÉÜ

    ¡¡¡¡Èý.½ø³Ì³Ø

    ¡¡¡¡ËÄ.½ø³ÌͨÐÅ

    ¡¡¡¡Îå.multiprocessingµÄһЩעÒâÊÂÏî

    ¡¡¡¡Ò».¶à½ø³Ì¸ÅÄî

    ¡¡¡¡¶à½ø³ÌÊÇÖ¸ÔÚͬһʱ¼äÄÚ£¬Í¬Ê±Ö´Ðжà¸ö³ÌÐò»ò¶à¸ö²¿·ÖµÄ³ÌÐò¡£Ã¿¸ö½ø³Ì¶¼ÓµÓÐ×Ô¼ºµÄµØÖ·¿Õ¼ä¡¢ÄÚ´æ¡¢ÎļþÃèÊö·ûºÍÆäËûϵͳ×ÊÔ´¡£¶à½ø³ÌµÄºÃ´¦ÔÚÓÚ¿ÉÒÔʹ³ÌÐò²¢ÐÐÖ´ÐУ¬´Ó¶øÌá¸ß³ÌÐòµÄÔËÐÐЧÂÊ¡£

    ¡¡¡¡¶þ.multiprocessingÄ£¿é½éÉÜ

    ¡¡¡¡multiprocessingÄ£¿éÌṩÁËÒ»¸öProcessÀ࣬¿ÉÒÔÓÃÀ´´´½¨ºÍ¹ÜÀí½ø³Ì¡£ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄʾÀý£º

    import multiprocessing
    
    def worker():
        """¸Ãº¯Êý½«ÔÚ×Ó½ø³ÌÖÐÖ´ÐÐ"""
        print('Worker')
    
    if __name__ == '__main__':
        # ´´½¨×Ó½ø³Ì
        p = multiprocessing.Process(target=worker)
        # Æô¶¯×Ó½ø³Ì
        p.start()
        # µÈ´ý×Ó½ø³Ì½áÊø
        p.join()

    ¡¡¡¡ÔÚÉÏÃæµÄ´úÂëÖУ¬workerº¯Êý½«ÔÚ×Ó½ø³ÌÖÐÖ´ÐС£Ê×ÏÈ£¬´´½¨ÁËÒ»¸öProcess¶ÔÏó£¬Ö¸¶¨target²ÎÊýΪworkerº¯Êý¡£È»ºó£¬Í¨¹ýµ÷ÓÃstart·½·¨Æô¶¯×Ó½ø³Ì£¬×îºóµ÷ÓÃjoin·½·¨µÈ´ý×Ó½ø³Ì½áÊø¡£

    ¡¡¡¡Èý. ½ø³Ì³Ø

    ¡¡¡¡Èç¹ûÐèÒª´´½¨´óÁ¿µÄ½ø³Ì£¬ÄÇôʹÓÃProcessÀà¿ÉÄܻᵼÖÂϵͳ×ÊÔ´µÄÀË·Ñ¡£´Ëʱ£¬¿ÉÒÔʹÓÃPoolÀàÀ´´´½¨½ø³Ì³Ø¡£ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄʾÀý£º

    import multiprocessing
    
    def worker(num):
        """¸Ãº¯Êý½«ÔÚ×Ó½ø³ÌÖÐÖ´ÐÐ"""
        print('Worker %d' % num)
    
    if __name__ == '__main__':
        # ´´½¨½ø³Ì³Ø
        pool = multiprocessing.Pool(4)
        # Æô¶¯½ø³Ì³ØÖеĽø³Ì
        pool.map(worker, range(10))
        # ¹Ø±Õ½ø³Ì³Ø
        pool.close()
        # µÈ´ý½ø³Ì³ØÖеĽø³Ì½áÊø
        pool.join()

    ¡¡¡¡ÔÚÉÏÃæµÄ´úÂëÖУ¬PoolÀàµÄ¹¹Ô캯ÊýÖÐÖ¸¶¨Á˽ø³Ì³ØµÄ´óСΪ4£¬È»ºóͨ¹ýµ÷ÓÃmap·½·¨À´Æô¶¯½ø³Ì³ØÖеĽø³Ì¡£map·½·¨»á½«workerº¯ÊýºÍrange(10)ÐòÁÐÖеÄÿ¸öÔªËØÒ»Ò»¶ÔÓ¦£¬È»ºó½«ËüÃÇ×÷Ϊ²ÎÊý´«µÝ¸ø½ø³Ì³ØÖеĽø³Ì¡£×îºó£¬µ÷ÓÃclose·½·¨¹Ø±Õ½ø³Ì³Ø£¬²¢µ÷ÓÃjoin·½·¨µÈ´ýËùÓнø³Ì½áÊø¡£

    ¡¡¡¡ËÄ. ½ø³ÌͨÐÅ

    ¡¡¡¡ÔÚ¶à½ø³Ì±à³ÌÖУ¬²»Í¬µÄ½ø³ÌÖ®¼äÐèÒª½øÐÐͨÐÅ¡£multiprocessingÄ£¿éÌṩÁ˶àÖÖ½ø³Ì¼äͨÐŵķ½Ê½£¬ÀýÈçʹÓöÓÁС¢¹ÜµÀ¡¢¹²ÏíÄÚ´æµÈ¡£

    ¡¡¡¡(1)¶ÓÁÐ

    ¡¡¡¡¶ÓÁÐÊÇÒ»ÖÖ³£ÓõĽø³Ì¼äͨÐÅ·½Ê½¡£multiprocessingÄ£¿éÖÐÌṩÁËQueueÀ࣬¿ÉÒÔÓÃÀ´´´½¨¶ÓÁС£ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄʾÀý£º

    import multiprocessing
    
    def producer(q):
        """¸Ãº¯Êý½«ÔÚÉú²úÕß½ø³ÌÖÐÖ´ÐÐ"""
        for i in range(10):
            q.put(i)
    
    def consumer(q):
        """¸Ãº¯Êý½«ÔÚÏû·ÑÕß½ø³ÌÖÐÖ´ÐÐ"""
        while True:
            item = q.get()
            if item is None:
                break
            print(item)
    
    if __name__ == '__main__':
        # ´´½¨¶ÓÁÐ
        q = multiprocessing.Queue()
        # ´´½¨Éú²úÕß½ø³Ì
        p1 = multiprocessing.Process(target=producer, args=(q,))
        # ´´½¨Ïû·ÑÕß½ø³Ì
        p2 = multiprocessing.Process(target=consumer, args=(q,))
        # Æô¶¯½ø³Ì
        p1.start()
        p2.start()
        # µÈ´ý½ø³Ì½áÊø
        p1.join()
        # ·¢ËͽáÊøÐźÅ
        q.put(None)
        p2.join()

    ¡¡¡¡ÔÚÉÏÃæµÄ´úÂëÖУ¬Ê×ÏÈ´´½¨ÁËÒ»¸öQueue¶ÔÏó£¬È»ºó´´½¨ÁËÒ»¸öÉú²úÕß½ø³ÌºÍÒ»¸öÏû·ÑÕß½ø³Ì¡£Éú²úÕß½ø³Ìͨ¹ýµ÷ÓÃput·½·¨½«0~9µÄÊý×Ö·ÅÈë¶ÓÁÐÖУ¬Ïû·ÑÕß½ø³Ìͨ¹ýµ÷ÓÃget·½·¨´Ó¶ÓÁÐÖлñÈ¡Êý¾Ý£¬²¢½«Æä´òÓ¡³öÀ´¡£×îºó£¬µ÷ÓÃput·½·¨·¢ËͽáÊøÐźÅ£¬È»ºóµÈ´ýÁ½¸ö½ø³Ì½áÊø¡£

    ¡¡¡¡(2)¹ÜµÀ

    ¡¡¡¡¹ÜµÀÊÇÁíÒ»ÖÖ³£ÓõĽø³Ì¼äͨÐÅ·½Ê½¡£multiprocessingÄ£¿éÖÐÌṩÁËPipeÀ࣬¿ÉÒÔÓÃÀ´´´½¨¹ÜµÀ¡£ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄʾÀý£º

    import multiprocessing
    
    def producer(conn):
        """¸Ãº¯Êý½«ÔÚÉú²úÕß½ø³ÌÖÐÖ´ÐÐ"""
        for i in range(10):
            conn.send(i)
        conn.close()
    
    def consumer(conn):
        """¸Ãº¯Êý½«ÔÚÏû·ÑÕß½ø³ÌÖÐÖ´ÐÐ"""
        while True:
            item = conn.recv()
            if item is None:
                break
            print(item)
    
    if __name__ == '__main__':
        # ´´½¨¹ÜµÀ
        conn1, conn2 = multiprocessing.Pipe()
        # ´´½¨Éú²úÕß½ø³Ì
        p1 = multiprocessing.Process(target=producer, args=(conn1,))
        # ´´½¨Ïû·ÑÕß½ø³Ì
        p2 = multiprocessing.Process(target=consumer, args=(conn2,))
        # Æô¶¯½ø³Ì
        p1.start()
        p2.start()
        # µÈ´ý½ø³Ì½áÊø
        p1.join()
        # ·¢ËͽáÊøÐźÅ
        conn1.send(None)
        p2.join()

    ¡¡¡¡ÔÚÉÏÃæµÄ´úÂëÖУ¬Ê×ÏÈ´´½¨ÁËÒ»¸ö¹ÜµÀ£¬È»ºó´´½¨ÁËÒ»¸öÉú²úÕß½ø³ÌºÍÒ»¸öÏû·ÑÕß½ø³Ì¡£Éú²úÕß½ø³Ìͨ¹ýµ÷ÓÃsend·½·¨½«0~9µÄÊý×Ö·¢Ë͵½¹ÜµÀÖУ¬Ïû·ÑÕß½ø³Ìͨ¹ýµ÷ÓÃrecv·½·¨´Ó¹ÜµÀÖлñÈ¡Êý¾Ý£¬²¢½«Æä´òÓ¡³öÀ´¡£×îºó£¬µ÷ÓÃsend·½·¨·¢ËͽáÊøÐźÅ£¬È»ºóµÈ´ýÁ½¸ö½ø³Ì½áÊø¡£

    ¡¡¡¡(3)¹²ÏíÄÚ´æ

    ¡¡¡¡¹²ÏíÄÚ´æÊÇÒ»ÖÖ¸ßЧµÄ½ø³Ì¼äͨÐÅ·½Ê½£¬ËüÔÊÐí¶à¸ö½ø³Ì¹²Ïíͬһ¿éÄÚ´æÇøÓò¡£multiprocessingÄ£¿éÖÐÌṩÁËValueºÍArrayÀ࣬¿ÉÒÔÓÃÀ´´´½¨¹²ÏíÄÚ´æ¡£ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄʾÀý£º

    import multiprocessing
    
    def worker1(n):
        """¸Ãº¯Êý½«ÔÚ½ø³Ì1ÖÐÖ´ÐÐ"""
        n.value += 1
        print('worker1:', n.value)
    
    def worker2(n):
        """¸Ãº¯Êý½«ÔÚ½ø³Ì2ÖÐÖ´ÐÐ"""
        n.value += 1
        print('worker2:', n.value)
    
    if __name__ == '__main__':
        # ´´½¨¹²ÏíÄÚ´æ
        n = multiprocessing.Value('i', 0)
        # ´´½¨½ø³Ì1
        p1 = multiprocessing.Process(target=worker1, args=(n,))
        # ´´½¨½ø³Ì2
        p2 = multiprocessing.Process(target=worker2, args=(n,))
        # Æô¶¯½ø³Ì
        p1.start()
        p2.start()
        # µÈ´ý½ø³Ì½áÊø
        p1.join()
        p2.join()

    ¡¡¡¡ÔÚÉÏÃæµÄ´úÂëÖУ¬Ê×ÏÈ´´½¨ÁËÒ»¸öValue¶ÔÏó£¬ÓÃÓÚ´æ´¢Ò»¸öÕûÊýÖµ¡£È»ºó´´½¨ÁËÁ½¸ö½ø³Ì£¬Ã¿¸ö½ø³Ì¶¼»á½«¹²ÏíÄÚ´æÖеÄÖµ¼Ó1£¬²¢½«Æä´òÓ¡³öÀ´¡£×îºó£¬µÈ´ýÁ½¸ö½ø³Ì½áÊø¡£

    ¡¡¡¡³ýÁËValueÀàÖ®Í⣬multiprocessingÄ£¿é»¹ÌṩÁËArrayÀ࣬ÓÃÓÚ´´½¨¹²ÏíÄÚ´æÊý×é¡£ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄʾÀý£º

    ¡¡¡¡ÔÚÉÏÃæµÄ´úÂëÖУ¬Ê×ÏÈ´´½¨ÁËÒ»¸öArray¶ÔÏó£¬ÓÃÓÚ´æ´¢Ò»¸öÕûÊýÊý×顣Ȼºó´´½¨ÁËÁ½¸ö½ø³Ì£¬Ã¿¸ö½ø³Ì¶¼»á½«¹²ÏíÄÚ´æÊý×éÖеĵÚÒ»¸öÔªËØ¼Ó1£¬²¢½«Æä´òÓ¡³öÀ´¡£×îºó£¬µÈ´ýÁ½¸ö½ø³Ì½áÊø¡£

    ¡¡¡¡Îå.multiprocessingµÄһЩעÒâÊÂÏî

    ¡¡¡¡ÔÚʹÓà multiprocessing Ä£¿é½øÐÐ¶à½ø³Ì±à³Ìʱ£¬ÐèҪעÒâÒÔϼ¸µã£º

    ¡¡¡¡1.È«¾Ö±äÁ¿µÄ¹²ÏíÎÊÌâ

    ¡¡¡¡Ã¿¸ö×Ó½ø³Ì¶¼ÓÐ×Ô¼ºµÄÄÚ´æ¿Õ¼ä£¬Òò´ËÈ«¾Ö±äÁ¿ÔÚ¶à½ø³ÌÖ®¼ä²»ÄÜÖ±½Ó¹²Ïí¡£Èç¹ûÐèÒª¹²ÏíÊý¾Ý£¬¿ÉÒÔʹÓà multiprocessing.Value »ò multiprocessing.Array À´´´½¨¹²ÏíÄÚ´æ¡£

    ¡¡¡¡2.½ø³Ì¼äͨÐÅÎÊÌâ

    ¡¡¡¡¶à¸ö½ø³ÌÖ®¼äÐèÒªÏ໥ͨÐÅ£¬¿ÉÒÔʹÓà multiprocessing.Queue »ò multiprocessing.Pipe À´½øÐнø³Ì¼äͨÐÅ¡£

    ¡¡¡¡3.½ø³Ì³ØµÄʹÓÃ

    ¡¡¡¡Èç¹ûÐèҪͬʱÆô¶¯¶à¸ö½ø³Ì£¬¿ÉÒÔʹÓýø³Ì³ØÀ´¹ÜÀí½ø³Ì¡£½ø³Ì³Ø¿ÉÒÔ±ÜÃâÆµ·±µØÆô¶¯ºÍ¹Ø±Õ½ø³ÌËù´øÀ´µÄ¿ªÏú£¬Ìá¸ß³ÌÐòµÄЧÂÊ¡£

    ¡¡¡¡4.×Ó½ø³ÌµÄÒì³£´¦Àí

    ¡¡¡¡Ã¿¸ö×Ó½ø³Ì¶¼ÊÇÒ»¸ö¶ÀÁ¢µÄ½ø³Ì£¬µ±×Ó½ø³Ì³öÏÖÒ쳣ʱ£¬Ö÷½ø³Ì²¢²»»áÊÕµ½Í¨Öª¡£Òò´ËÐèÒªÔÚ×Ó½ø³ÌÖнøÐÐÒì³£´¦Àí£¬²¢½«Òì³£ÐÅϢͨ¹ý½ø³Ì¼äͨÐŵķ½Ê½´«µÝ¸øÖ÷½ø³Ì¡£

    ¡¡¡¡5.½ø³ÌµÄÆô¶¯·½Ê½

    ¡¡¡¡¿ÉÒÔʹÓà multiprocessing.Process À´´´½¨½ø³Ì£¬Ò²¿ÉÒÔʹÓà multiprocessing.Pool À´´´½¨½ø³Ì³Ø¡£½ø³Ì³Ø¿ÉÒÔ·½±ãµØ¹ÜÀí¶à¸ö½ø³Ì£¬±ÜÃâÊÖ¶¯Æô¶¯ºÍ¹Ø±Õ½ø³ÌËù´øÀ´µÄÂé·³¡£

    0 ·ÖÏíµ½£º
    ºÍÎÒÃÇÔÚÏß½»Ì¸£¡
    ¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿