进程

Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了

multiprocessing模块中提供了Process , Queue , Pipe , Lock , RLock , Event , Condition等组件 , 与threading模块有很多相似之处

1.创建进程

from multiprocessing import Process
import time

def func(name):
    time.sleep(2)
    print('hello',name)

if __name__ == '__main__':
    p= Process(target=func,args=('derek',))
    p.start()
    # p.join()
    print('end...')
View Code

2.进程间通讯

(1)Queue

不同进程间内存是不共享的,要想实现两个进程间的数据交换。进程间通信有两种主要形式 , 队列和管道

from multiprocessing import Process, Queue   #Queue是进程排列

def f(test):
    test.put('22')   #通过创建的子进程往队列添加数据,实线父子进程交互

if __name__ == '__main__':
    q = Queue()      #父进程
    q.put("11")

    p = Process(target=f, args=(q,))   #子进程
    p.start()
    p.join()

    print("取到:",q.get_nowait())
    print("取到:",q.get_nowait())

#父进程在创建子进程的时候就把q克隆一份给子进程
#通过pickle序列化、反序列化,来达到两个进程之间的交互



结果:
取到: 11
取到: 22
Queue

(2)Pipe(管道)

The Pipe() function returns a pair of connection objects connected by a pipe which by default is duplex (two-way).

from multiprocessing import Process, Pipe

def f(conn):
    conn.send('11')
    conn.send('22')
    print("from parent:",conn.recv())
    print("from parent:", conn.recv())
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()   #生成管道实例,可以互相send()和recv()

    p = Process(target=f, args=(child_conn,))
    p.start()

    print(parent_conn.recv())      # prints "11"
    print(parent_conn.recv())      # prints "22"
    parent_conn.send("33")         # parent 发消息给 child
    parent_conn.send("44")
    p.join()
Pipe

相关文章: