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

¡¡¡¡PythonÖеÄmultiprocessingÄ£¿éÌṩÁËÒ»ÖÖ´´½¨ºÍ¹ÜÀí½ø³ÌµÄ·½Ê½£¬Ê¹µÃ¿ÉÒÔÀûÓöà¸öCPUÀ´¼ÓËÙ³ÌÐòÔËÐС£ÔÚÕâÀÎÒ»áÏêϸ½éÉÜPythonÖÐµÄ¶à½ø³Ì±à³Ì£¬°üÀ¨ÒÔÏÂÄÚÈÝ£º
¡¡¡¡Ò».¶à½ø³Ì¸ÅÄî
¡¡¡¡¶þ.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Ä£¿éÌṩÁ˶àÖÖ½ø³Ì¼äͨÐŵķ½Ê½£¬ÀýÈçʹÓöÓÁС¢¹ÜµÀ¡¢¹²ÏíÄÚ´æµÈ¡£
¡¡¡¡¶ÓÁÐÊÇÒ»ÖÖ³£ÓõĽø³Ì¼äͨÐÅ·½Ê½¡£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·½·¨·¢ËͽáÊøÐźţ¬È»ºóµÈ´ýÁ½¸ö½ø³Ì½áÊø¡£
¡¡¡¡¹ÜµÀÊÇÁíÒ»ÖÖ³£ÓõĽø³Ì¼äͨÐÅ·½Ê½¡£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·½·¨·¢ËͽáÊøÐźţ¬È»ºóµÈ´ýÁ½¸ö½ø³Ì½áÊø¡£
¡¡¡¡¹²ÏíÄÚ´æÊÇÒ»ÖÖ¸ßЧµÄ½ø³Ì¼äͨÐÅ·½Ê½£¬ËüÔÊÐí¶à¸ö½ø³Ì¹²Ïíͬһ¿éÄÚ´æÇøÓò¡£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.Value »ò multiprocessing.Array À´´´½¨¹²ÏíÄÚ´æ¡£
¡¡¡¡¶à¸ö½ø³ÌÖ®¼äÐèÒªÏ໥ͨÐÅ£¬¿ÉÒÔʹÓà multiprocessing.Queue »ò multiprocessing.Pipe À´½øÐнø³Ì¼äͨÐÅ¡£
¡¡¡¡Èç¹ûÐèҪͬʱÆô¶¯¶à¸ö½ø³Ì£¬¿ÉÒÔʹÓýø³Ì³ØÀ´¹ÜÀí½ø³Ì¡£½ø³Ì³Ø¿ÉÒÔ±ÜÃâÆµ·±µØÆô¶¯ºÍ¹Ø±Õ½ø³ÌËù´øÀ´µÄ¿ªÏú£¬Ìá¸ß³ÌÐòµÄЧÂÊ¡£
¡¡¡¡Ã¿¸ö×Ó½ø³Ì¶¼ÊÇÒ»¸ö¶ÀÁ¢µÄ½ø³Ì£¬µ±×Ó½ø³Ì³öÏÖÒ쳣ʱ£¬Ö÷½ø³Ì²¢²»»áÊÕµ½Í¨Öª¡£Òò´ËÐèÒªÔÚ×Ó½ø³ÌÖнøÐÐÒì³£´¦Àí£¬²¢½«Òì³£ÐÅϢͨ¹ý½ø³Ì¼äͨÐŵķ½Ê½´«µÝ¸øÖ÷½ø³Ì¡£
¡¡¡¡¿ÉÒÔʹÓà multiprocessing.Process À´´´½¨½ø³Ì£¬Ò²¿ÉÒÔʹÓà multiprocessing.Pool À´´´½¨½ø³Ì³Ø¡£½ø³Ì³Ø¿ÉÒÔ·½±ãµØ¹ÜÀí¶à¸ö½ø³Ì£¬±ÜÃâÊÖ¶¯Æô¶¯ºÍ¹Ø±Õ½ø³ÌËù´øÀ´µÄÂé·³¡£
±±¾©Ð£Çø