Windows下,要把启动程序写在if __name__ == '__main__':里面执行

1,进程间的数据不共享

import multiprocessing
import threading

data_list = []

def task(arg):
    data_list.append(arg)
    print(data_list)

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,))
        p.start()
        
if __name__ == '__main__':
    run()

结果:
[3]
[2]
[0]
[6]
[5]
[4]
[1]
[7]
[9]
[8]
View Code

2,其他常用共能:

  .join() :控制主进程等待子进程的时间

  .setDaemon(True):主进程不再等,主进程结束则所有子进程终止

  .setName() : 设置名字

  getName()  获取当前进程的名字

  multiprocessing.current_process()  获取当前进程

  multiprocessing.current_process().ident/pid  获取当前进程的id

以上用法都跟线程的用法相似,可以对比记忆

 

3,进程间的数据共享

  (1),multiprocessing.Queue

 

import multiprocessing
import threading
import queue
import time

q = multiprocessing.Queue()

def task(arg,q):
    q.put(arg)

if __name__ == '__main__':
    q = multiprocessing.Queue()
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,q,))
        p.start()
    while True:
        v = q.get()
        print(v)
Windows,需要放在main里面

 

import multiprocessing
import threading
import queue
import time

q = multiprocessing.Queue()

def task(arg,q):
    q.put(arg)

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task, args=(i, q,))
        p.start()

    while True:
        v = q.get()
        print(v)

run()
linux:

  (2),Manager

import time
import threading
import multiprocessing

def task(arg,dic):
    time.sleep(2)
    dic[arg] = 100

if __name__ == '__main__':
    m = multiprocessing.Manager()
    dic = m.dict()

    process_list = []
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,dic,))
        p.start()

        process_list.append(p)

    while True:
        count = 0
        for p in process_list:
            if not p.is_alive():
                count += 1
        if count == len(process_list):
            break
    print(dic)
windows
import time
import threading
import multiprocessing

m = multiprocessing.Manager()
dic = m.dict()


def task(arg):
    dic[arg] = 100


def run():
    for i in range(10):
        p = multiprocessing.Process(target=task, args=(i,))
        p.start()

    input('>>>')
    print(dic.values())


if __name__ == '__main__':
    run()
linux

 

4,进程锁: 跟线程锁对照记忆

5,进程池

import time
from concurrent.futures import ProcessPoolExecutor

def task(arg):
    time.sleep(2)
    print(arg)

if __name__ == '__main__':
    pool = ProcessPoolExecutor(5)
    for i in range(10):
        pool.submit(task,i)
View Code