1. 程式人生 > >W10_Pipe_Manager數據共享_進程池和回調函數

W10_Pipe_Manager數據共享_進程池和回調函數

send 進程 tip 管道 error: 數量 %d brush for

[TOC]

#管道

```
from multiprocessing import Pipe,Process

def func(conn2):
    print(conn2.recv())

conn1,conn2 = Pipe()
conn1.send("Hello pipe")
p = Process(target=func, args=(conn2,))
p.start()

```

**多進程中管道異常EOFError**

```

from multiprocessing import Pipe, Process
import time
import random


def func_recv(conn1, conn2):
    conn2.close()
    while True:
        try:
            print(conn1.recv())
            time.sleep(random.random())
        except EOFError:
            conn1.close()
            print("recv done")
            break


def func_send(conn1, conn2):
    conn1.close()
    for i in range(4):
        conn2.send("msg %d" % i)
    conn2.close()


conn1, conn2 = Pipe()
recv_p = Process(target=func_recv, args=(conn1, conn2))
send_p = Process(target=func_send, args=(conn1, conn2))
recv_p.start()
send_p.start()
conn1.close()
conn2.close()

```
註意:多進程使用管道可能會出現數據不安全,需要加鎖操作

[返回頂部](#top)



#進程間的數據共享

```
from multiprocessing import Manager
```



#進程池和回調函數

##1.為什麽會有進程池的概念
   效率;
   每開啟進程,開啟屬於這個進程的內存空間(如寄存器,堆棧,文件都會戰用內存空間);
   進程過多,操作系統調試較為耗時
##2.進程池原理:
    python中先創建一個屬於進程的池子,這個池子指定能存放多少進程,任務存放於隊列,等待進程池中的進程處理,當一個進程處理完一個任務後,並不銷毀,而是放回進程池,然後繼續去任務隊列中拿取下一個任務,這就節省了進程被銷毀和再創建的時間,也節省了過多進程調度的時間;
    信號量與之相比,只是節省了調度時間,因為信號裏是控制進程執行的數量,並不能控制進程創建的數量。



```
```

  

W10_Pipe_Manager數據共享_進程池和回調函數