python 学习总结2 多进程

多进程:

我们什么时候需要多进程呢?我们知道python的多线程,实际不是真实的多线程,它同一时间在一个cpu执行一个任务,它通过上下文的切换来让我看起来是多并发的,

那么如果我们想要真正实现多个任务在多个cpu上同时执行,我们就需要多进程的性质来帮忙了(python的多线程不适合cpu密集型的任务,适合io密集型的任务)。

import multiprocessing
import threading

def thread_run():
    print(threading.get_ident())
def run():
    print("ok")
    t=threading.Thread(target=thread_run(),)
    t.start()
if __name__=="__main__":
    for i in range(10):
        p=multiprocessing.Process(target=run,)
        p.start()

上端代码体现了多进程用法其实就是在形式上与多线程是大同小异的!

通过学习多线程我们知道所有的线程都是有一个父线程

from multiprocessing import Process
import os

def info(title):
    print(title)
    #os.getppid 显示父线程的id
    print(‘parent process:‘, os.getppid())
    #os.getid显示子线程的id
    print(‘process id:‘, os.getpid())
    print("\n\n")

def f(name):
    info(‘\033[31;1mcalled from child process function f\033[0m‘)
    print(‘hello‘, name)

if __name__ == ‘__main__‘:
    info(‘\033[32;1mmain process line\033[0m‘)
    p = Process(target=f, args=(‘bob‘,))
    p.start()

通过上面的代码,我们在主线程调用info显示了 主线程相对的 父线程,与子线程,而且我们发现父线程就是pycharm本身,其子线程作为相对于这段代码子线程的主线程,通过这段代码我们了解了Python的主线程与子线程之间的关系

多进程Queue:

那么我们如何实现主线程与子线程公用一块数据呢,也就是我们怎么才能实现两个进程之间的交互呢?看下文

多进程的Queue与线程中的队列是不同的,注意不能在多进程中调用线程的Queue因为每个线程都有各自占用一块内存,多线程是共享一块内存的,本质上是不同的

import multiprocessing
def f(qq):
    print("in child:",qq.qsize())
    qq.put([42, None, ‘hello‘])
if __name__ == ‘__main__‘:
    q = multiprocessing.Queue()
    q.put("test123")
    p = multiprocessing.Process(target=f, args=(q,))
    p.start()
    p.join()

多进程的pipes与manager:

我们的管道实际上就像socket 一样 ,其实就是相互收发的过程

from multiprocessing import Process, Pipe

def f(conn):
    #在子线程发送信息
    conn.send([42, None, ‘hello from child‘])
    conn.send([42, None, ‘hello from child3‘])
    print("",conn.recv())
    conn.close()

if __name__ == ‘__main__‘:
  #注意建立的顺序,有两个其实顺序无所谓,注意后面的接受顺序就好
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print("parent",parent_conn.recv())  # prints "[42, None, ‘hello‘]"
    print("parent",parent_conn.recv())  # prints "[42, None, ‘hello‘]"
    parent_conn.send(" from hshs")  # prints "[42, None, ‘hello‘]"
    p.join()
下面是manager的用法 ,实际上都类似,体现了两个进程分享一些
from multiprocessing import Process, Manager
import os

def f(d, l):
    d[1] = ‘1‘
    d[‘2‘] = 2
    d["pid%s" %os.getpid()] = os.getpid()
    l.append(1)
    print(l,d)

if __name__ == ‘__main__‘:
    with Manager() as manager:
        d = manager.dict()

        l = manager.list(range(5))

        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()
        l.append("from parent")
        print(d)
        print(l)
数据进行修改
时间: 2024-10-04 12:28:26

python 学习总结2 多进程的相关文章

python学习笔记(多进程并发)

理论篇: 1.什么是进程: 进程:计算机系统中正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 2.进程和程序的区别: 程序是实现功能的一堆代码,而进程是程序运行的过程. 注:同一个程序同时打开两次或多次,就会启动两个或多个进程. 3.并发与并行: 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务 一 并发:是伪并行,即看起来是同时运行.单个cpu+多道技术就可以实现

python学习笔记——multiprocess 多进程组件Pool

1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成多个进程,几十个尚可,若上百个甚至更多时,手动限制进程数量就显得特别繁琐,此时进程池就显得尤为重要. 进程池Pool类可以提供指定数量的进程供用户调用,当有新的请求提交至Pool中时,若进程池尚未满,就会创建一个新的进程来执行请求:若进程池中的进程数已经达到规定的最大数量,则该请求就会等待,直到进程

Python学习笔记(四)多进程的使用

python中多进程与Linux 下的C基本相同.   fork的基本使用   先看最简单的例子: # coding: utf-8 import os def my_fork(): pid = os.fork() if pid == 0: print 'this is child, pid = %d, parent id = %d' % (os.getpid(), os.getppid()) elif pid > 0: print 'this is parent, pid = %d, child

Python学习的个人笔记(基础语法)

Python学习的个人笔记 题外话: 我是一个大二的计算机系的学生,这份python学习个人笔记是趁寒假这一周在慕课网,w3cschool,还有借鉴了一些博客,资料整理出来的,用于自己方便的时候查阅,一开始保存在word上,代码不是很好看,于是决定复制到博客里面,可能有复制过程中出错的,或者我本身在理解方面有出错的地方,希望能得到指正,谢谢  后续的内容我会继续学习…… python下载地址  www.python.org Python 分为2.7和3.3两个版本,3.3有些库不兼容,因此用2.

Python学习笔记进阶篇——总览

Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(多线程与进程池) Python学习笔记——进阶篇[第九周]———线程.进程.协程篇(队列Queue和生产者消费者模型) Python学习笔记——进阶篇[第九周]———协程 Python学习笔记——进阶篇[第九周]———MYSQL操作

Tornado/Python 学习笔记(二)

部分ssrpc.py代码分析 -- 服务端: 1 #!/usr/bin/python3 2 3 from xmlrpc.client import Fault, dumps, loads 4 import sys 5 from socketserver import ForkingMixIn 6 from xmlrpc.server import SimpleXMLRPCServer 7 8 class VerboseFaultXMLRPCServer(SimpleXMLRPCServer):

Python学习---Python的异步IO[all]

1.1.1. 前期环境准备和基础知识 安装: pip3 install aiohttp pip3 install grequests pip3 install wheel pip3 install scrapy 注意: windows上scrapy依赖 https://sourceforge.net/projects/pywin32/files/ 安装Twisted a. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted, b. 下载:Twis

Python 学习入门(0)—— 简明教程

朋友问我怎么能快速地掌握Python. 我想Python包含的内容很多,加上各种标准库,拓展库,乱花渐欲迷人眼,就想写一个快速的Python教程,一方面 保持言语的简洁,另一方面循序渐进,尽量让没有背景的读者也可以从基础开始学习.另外,我在每一篇中专注于一个小的概念,希望可以让人可以在闲暇时很快读完. 小提醒 1. 教程将专注于Python基础,语法基于Python 2.7,测试环境为Linux, 不会使用到标准库之外的模块. 2. 我将专注于Python的主干,以便读者能以最快时间对Pytho

Python学习教程:最全Python110道面试题!面试你肯定用得上!

Python学习教程(Python学习路线):最全Python面试题! 为了大家更好的消化,这里分成几次给大家出题目和教程! 1.一行代码实现1--100之和 利用sum()函数求和 2.如何在一个函数内部修改全局变量 函数内部global声明 修改全局变量 3.列出5个python标准库 os:提供了不少与操作系统相关联的函数 sys: 通常用于命令行参数 re: 正则匹配 math: 数学运算 datetime:处理日期时间 4.字典如何删除键和合并两个字典 del和update方法 5.谈