python多进程 使用multiprocessing创建线程池 进程间通讯 进程同步 共享内存

multiprocessing

1
2
3
4
5
6
7
8
from multiprocessing import Process

def run_process(name):
print("Process %s Running" %(os.getpid()))

p = Process(target=run_process, args=(str(i), )
p.start()
p.join()

使用multiprocessing创建线程池

1
2
3
4
5
6
7
8
9
10
11
12
from multiprocessing import Pool

def run_task(name):
print("Process %s Running" %(os.getpid()))

p = Pool(processes=3)

for i in range(5):
p.apply_async(run_task, args=(i, ))

p.close() # 先close,然后再join
p.join()

进程间通讯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from multiprocessing import Queue

def proc_write(q, urls):
for url in urls:
q.put(url)
time.sleep(3)

def proc_read(q):
while True:
url = q.get(True)
print(url)

q = Queue()
p_write1 = Process(target=proc_write, args=(q, urls1))
p_write2 = Process(target=proc_write, args=(q, urls2))
p_read = Process(target=proc_read, args=(q))

p_write1.start()
p_write2.start()
p_read.start()

p_write1.join()
p_write2.join()
p_read.terminate()

进程同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from multiprocessing import Process, Lock

def f(l, i):
l.acquire()
try:
print("hello world", i)
finally:
l.release()

if __name__ == "__main__":
lock = Lock()

for num in range(10):
Process(target=f, args=(lock, num)).start()

共享内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from multiprocessing import Process, Value, Array
def f(n, a):
n.value = 3.1415926
for i in range(len(a)):
a[i] = -a[i]

if __name__ == "__main__":
num = Value('d', 0.1)
arr = Array('i', range(10))

p = Process(target=f, args=(num, arr))
p.start()
p.join()

print(num.value)
print(arr[:])