博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python之多进程
阅读量:4477 次
发布时间:2019-06-08

本文共 5027 字,大约阅读时间需要 16 分钟。

 

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

 

 

 

1. multiprocessing模块的简单使用

# -*- coding:utf-8 -*-# Author:Wong Du'''简单理解进程与线程    进程:        进程是系统资源分配的最小单位        进程是一堆系统资源的集合,不可执行        进程内可以有多个线程        进程间内存等所有的资源空间互相隔离,要实现资源数据通信可通过建立socket规则    线程:        线程是程序执行的最小调度单位        线程是进程的一个执行流(执行代码)        线程间内存等资源空间数据共享介绍multiprocessing模块多进程的简单使用'''import multiprocessingimport threadingimport 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 multiprocessing11 import time12 import os13 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函数,查看子进程及其父进程的进程id23     info("\033[31;1mFunction Info\033[0m")24     # print("Function done\n")25 26 if __name__ == '__main__':27     # 执行info函数,查看主进程及其父进程的进程id28     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 Dufrom multiprocessing import Process, Poolimport timedef run(n):    time.sleep(1)    print("Hello world", n)    return n + 1000def 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 Dufrom multiprocessing import Process, Managerfrom 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, Pipeimport 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 multiprocessingimport queuedef 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 multiprocessingimport queuedef 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 multiprocessingimport threadingimport queuedef 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实现数据交互

 

转载于:https://www.cnblogs.com/Caiyundo/p/9543067.html

你可能感兴趣的文章
实现icon和文字垂直居中的两种方法-(vertical-align and line-height)
查看>>
[CareerCup] 3.6 Sort Stack 栈排序
查看>>
Beta版总结会议
查看>>
Cocos2d-x中使用的数据容器类
查看>>
创建ORACLE 查询用户
查看>>
jzoj3297. 【SDOI2013】逃考
查看>>
通过例子学python(2.1)
查看>>
高效率场景-内存映射
查看>>
Python基础——0前言
查看>>
机器学习三剑客之Numpy
查看>>
django路由转发
查看>>
HBase环境搭建随笔
查看>>
SAX vs. DOM (Event vs. Tree)
查看>>
堆排序原理及算法实现(最大堆)
查看>>
说说无线路由器后门的那些事儿(1)-D-Link篇
查看>>
AJAX POST&跨域 解决方案 - CORS
查看>>
C#基础之接口
查看>>
nio 序列化
查看>>
Hadoop集群时钟同步
查看>>
C++二维数组讲解、二维数组的声明和初始化
查看>>