1. 程式人生 > >python之 《程序之間資料互動和程序池》

python之 《程序之間資料互動和程序池》

1.程序q

  程序呢就相當於一個房子,執行緒就相當於是房子裡面在工作的人,那麼一個房子的空間對於房子裡面的人來說是共享的,

現在是多程序,也就是說有許多房子,很顯然這個房子的空間只屬於這個房子,不會屬於其他房子,那你應該明白我想說什麼了,(一個程序裡面資源是共享的,不同程序之間是相當於不同的程式,你QQ的訊息微信能度的到嘛?很顯然嘛,肯定是不能的,但是啊條件就來了,我擦我現在程式開了多程序,想讓兩個程序之間的資料互動怎麼辦?)

  解決這一問題的關鍵就要看你怎麼理解程序這個概念了,現在別人qq發給你的東西你要在微信上發出去,怎麼辦,當然是先存到手機裡面啊,然後在發出啊,對了。那麼我們的程序queue就是這麼一個過程,先把資料序列化存下來,然後在使用。相當於拷貝了一份

  

from multiprocessing import Queue, Process
import os

def f(qq):
    qq.get()
    qq.put(6)


if __name__ == '__main__':
    q = Queue()
    q.put(1)
    q.put(2)
    p = Process(target=f, args=(q,))
    p.start()
    p.join()
    print(q.qsize())

 

2.執行緒不能給程序傳q,所以執行緒queue的東西其他程序不能使用

3.程序q當作變數傳入,其實不是傳入,而是克隆進去了。其實是兩個q只不過序列化了,因為程序通訊不能在記憶體裡面操作,實際上是兩個q不是一個共享q,要注意中間狀態

 

 

*******************************************pipe********

pipe 相當於是一個管道在使用他之前我們需要把管道的頭和尾打通,也就是生成兩個物件,然後把一個物件當作引數傳到程序裡面就可以了

from multiprocessing import Process,Pipe
import os
def f(liu):
    print('
wocao pid:',os.getpid()) liu.send('wocao',) if __name__ == '__main__': print('start ') Parent_coon, child_coon = Pipe() p = Process(target=f,args=(child_coon,)) p.start() cc = Parent_coon.recv() p.join() print(cc)

 

 

 

4.manage資料共享 pipe

with Manager() as manger:
d = manger.dict()
l = manger.list()

那麼manage呢就是簡化了的特定的用來在程序之間互動的一個東西,他可以支援列表字典元組變數等等。

如上我們就生成了一個程序互動的字典與列表,使用他需要把他當作引數傳入進去即可

# _*_coding:utf-8_*_
# /usr/bin/env python3
# Author:book Miki

# 程序之間資料互動用一箇中間狀態的queue,也就是經程序queue


from multiprocessing import Queue, Process, Manager  # 匯入一個程序queue
import threading
import queue
import os

def f(d,l):
    d['name'] = 'liu'
    d[1] = 3
    l.append(os.getpid())
    print(l)

if __name__ == '__main__':
    with Manager() as manger:
        d = manger.dict()
        l = manger.list()
        process_list = []
        for i in range(10):
            P = Process(target=f, args=(d, l))
            P.start()
            process_list.append(P)
        for i in process_list:
            i.join()

        print(d)
        print(l)

 

5. 程序鎖 程序為什麼需要鎖呢? 因為啊 所有程序都在共享同一快螢幕,所以需要鎖,我們在main裡面生成鎖的例項,當作引數傳進去

同一份pipe程式碼我們加上鎖之後就變成了
from multiprocessing import Process,Pipe, Lock
import os
def f(l,liu):
    l.acquire()
    print('wocao pid:',os.getpid())
    liu.send('wocao',)
    l.release()
if __name__ == '__main__':
    print('start ')
    lock = Lock()
    Parent_coon, child_coon = Pipe()
    p = Process(target=f, args=(lock, child_coon))
    p.start()
    cc = Parent_coon.recv()
    p.join()
    print(cc)

 


程序池的概念就是說同一時間允許多少個程序在執行
在window上啟動多程序就必須使用
if __name__ == '__main__':
並且pool要在其裡面
pool 裡面沒有開啟開程序的語句,只有apply 序列 apply_async並行這兩個, 後者多了一個回撥也就是 callback 有了回撥,開程序的那個函式的返回值,將會作為引數傳入回撥的函式裡面
# _*_coding:utf-8_*_
# /usr/bin/env python3
# Author:book Miki


from multiprocessing import Process,Pool,freeze_support
import time
import os

def f(i):
    time.sleep(2)
    print('this process pid is :', os.getpid())
    return i+100


def bag(ar):
    print('-->exec done: ', ar, os.getpid())


if __name__ == '__main__':
    # freeze_support()
    print(os.getpid())
    pool = Pool(5)

    for i in range(10):
        pool.apply_async(func=f,args=(i,), callback=bag)


    print('end')
    pool.close()
    pool.join()

序列的直接開就可以了,沒有回撥哦。回撥的程序的pid號是主函式的pid號。也就是說回撥函式是在主函式裡面執行的哦。