Python之多进程

 

简单理解进程与线程
  进程:
    1.进程是系统资源分配的最小单位
    2.进程是一堆系统资源的集合,不可执行
    3.进程内可以有多个线程
    4.进程间内存等所有的资源空间互相隔离,要实现资源数据通信可通过建立socket规则

  线程:
    1.线程是程序执行的最小调度单位
    2.线程是进程的一个执行流(执行代码)
    3.线程间内存等资源空间数据共享

 

 

 

1. multiprocessing模块的简单使用

# -*- coding:utf-8 -*-
# Author:Wong Du

'''
简单理解进程与线程
    进程:
        进程是系统资源分配的最小单位
        进程是一堆系统资源的集合,不可执行
        进程内可以有多个线程
        进程间内存等所有的资源空间互相隔离,要实现资源数据通信可通过建立socket规则

    线程:
        线程是程序执行的最小调度单位
        线程是进程的一个执行流(执行代码)
        线程间内存等资源空间数据共享
介绍multiprocessing模块多进程的简单使用
'''

import multiprocessing
import threading
import time

# 线程函数
def thread_run():
    # 查看当前线程的id号
    print(threading.current_thread())
    time.sleep(2)

def run(name):
    print("Hello", name)
    # 查看当前的进程信息
    print(multiprocessing.current_process())
    # 注册并运行线程
    t = threading.Thread(target=thread_run())
    t.start()


if __name__ == '__main__':
    for i in range(10):
        # 注册并运行进程
        m = multiprocessing.Process(target=run, args=("boy%s" % i, ))
        m.start()
 1 # -*- coding:utf-8 -*-
 2 # Author:Wong Du
 3 
 4 '''
 5 多进程之getid,
 6 .py文件执行,系统调用生成.py文件的主进程,主进程通过multiprocessing模块创建子进程
 7 即:“系统调用程序”为.py文件主进程的父进程,.py文件主进程为子进程的父进程
 8 '''
 9 
10 import multiprocessing
11 import time
12 import os
13 
14 def info(info=None):
15     print(info)
16     print("Parent Process id:", os.getppid())
17     print("Current Process id:", os.getpid())
18     print("Process done\n")
19     time.sleep(1)
20 
21 def run():
22     # 执行info函数,查看子进程及其父进程的进程id
23     info("\033[31;1mFunction Info\033[0m")
24     # print("Function done\n")
25 
26 if __name__ == '__main__':
27     # 执行info函数,查看主进程及其父进程的进程id
28     info("\033[31;1mProcess Info\033[0m")
29 
30     # 注册进程
31     t = multiprocessing.Process(target=run, )
32     # 运行进程
33     t.start()
34     # 等待进程执行结束,再往下执行代码
35     t.join()
multiprocessing模块进程id号介绍

 

2. 进程池,同时执行多少个进程

# -*- coding:utf-8 -*-
# Author:Wong Du

from multiprocessing import Process, Pool
import time

def run(n):
    time.sleep(1)
    print("Hello world", n)
    return n + 1000


def war(arg):
    print("\033[36;1m---exec done---\033[0m", arg)

if __name__ == '__main__':
    pool = Pool(2)
    for i in range(10):
        # pool.apply(run, args=(i, ))   # 同步,即串行
        pool.apply_async(run, args=(i, ), callback=war) # 异步,即并行

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

 

3. Python中通过Manager方法实现进程间数据共享

# -*- coding:utf-8 -*-
# Author:Wong Du

from multiprocessing import Process, Manager
from os import getpid



# 子进程函数
def run(d, l):
    pid = getpid()
    d[pid] = pid + 1
    l.append(pid)

    print(l)

if __name__ == "__main__":
    # 生成一个manager对象,并创建共享字典d和列表l
    with Manager() as manager:
        d = manager.dict()  # 生成一个空字典,用于数据共享
        l = manager.list(range(5))  # 生成一个空列表,用于数据共享


        p_list = []
        for i in range(10):
            # 注册进程并把共享字典d和共享列表l传进去
            p = Process(target=run, args=(d, l, ))
            p.start()
            p_list.append(p)

        # 确保子进程全部执行完毕再执行下面代码,避免无法访问主进程的共享数据
        for j in p_list:
            j.join()

        print("\033[32;1m%s\033[0m" % d)
        print("\033[33;1m%s\033[0m" % l)

 

4. Python中通过Pipe方法实现进程间交互

# -*- coding:utf-8 -*-
# Author:Wong Du

'''
通过multiprocessing模块的Pipe方法实现进程间的通信
'''

from multiprocessing import Process, Pipe
import time

# 子进程函数
def run(child):
    # 发送数据给parent_conn连接对象
    child.send("Nice to meet you..")
    time.sleep(2)
    # 接收从parent_conn发来的数据
    res = child.recv()
    
    print(res)

if __name__ == "__main__":
    # 建立进程间连接对象
    parent_conn, child_conn = Pipe()
    
    # 注册并将其中一个连接对象传给进程
    p = Process(target=run, args=(child_conn, ))
    # 运行进程
    p.start()
    
    # 接收child_conn发送来的数据
    data = parent_conn.recv()
    # 发送数据给child_conn
    parent_conn.send("Nice to meet you too...")
    
    print(data)

 

5. Python中通过进程Queue实现进程间数据交互

# -*- coding:utf-8 -*-
# Author:Wong Du

"""
import multiprocessing
import queue

def run():
    q.put(["Caiyun",None,"23"])

if __name__ == "__main__":
    q = queue.Queue()
    p = multiprocessing.Process(target=run,)
    p.start()
    print( q.get_nowait() )

# NameError: name 'q' is not defined
"""

"""
import multiprocessing
import queue

def run(q):
    q.put(["Caiyun",None,"23"])

if __name__ == "__main__":
    q = queue.Queue()
    p = multiprocessing.Process(target=run, args=(q, ))
    p.start()
    print( q.get_nowait() )
    
# TypeError: can't pickle _thread.lock objects
"""

"""
import multiprocessing
import threading
import queue

def run():
    q.put(["Caiyun", None, 23])

if __name__ == "__main__":
    q = queue.Queue()
    # p = multiprocessing.Process(target=run, args=(q, ))
    p = threading.Thread(target=run)
    p.start()
    print( q.get_nowait() )

# ['Caiyun', None, 23]
"""

import multiprocessing, time
# from multiprocessing import Queue,Process

# 进程函数
def run(q):
    time.sleep(2)
    # 往进程Queue中加入数据
    q.put(["Caiyun", None, 23])

if __name__ == "__main__":
    # 生成一个进程队列Queue
    q = multiprocessing.Queue()
    
    # 注册进程并发进程Queue传进去
    p = multiprocessing.Process(target=run, args=(q, ))
    # 运行进程
    p.start()

    # 从进程Queue中获取数据
    print(q.get())
    # print( q.get_nowait() )   # 由于两个进程是同时执行的,get_nowait()会出现问题
    
进程Queue实现数据交互

 

posted @ 2018-08-27 17:22  糕事情  阅读(159)  评论(0编辑  收藏  举报