返回顶部
首页 > 资讯 > 后端开发 > Python >Python的进程
  • 458
分享到

Python的进程

进程Python 2023-01-31 07:01:33 458人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

说明:本文是基于Py2.X环境,3.X在我电脑上出了些问题。两者差别并不大。 python实现多进程的方式主要有两种:一种方法是使用os模块中的fork方法; 另一种是使用multiprocessing模块。这两种方法的区别在于前者仅

说明:本文是基于Py2.X环境,3.X在我电脑上出了些问题。两者差别并不大。

python实现多进程的方式主要有两种:一种方法是使用os模块中的fork方法; 另一种是使用multiprocessing模块。这两种方法的区别在于前者仅适用于Unix/linux操作操作。对win是不支持的,而后者则是跨平台的实现方式。

使用os模块中的fork方式实现多进程。

Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程:


import os

print 'Process (%s) start...' % os.getpid()

pid = os.fork()

if pid == 0:

    print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())

else:

    print 'I (%s) just created a child process (%s).' % (os.getpid(), pid)

得到:

Process (2450) start...

I (2450) just created a child process (2451).

I am child process (2451) and my parent is 2450.

使用Multiprocessing查模块创建多进程。

multiprocessing模块提供了一个Process类来描述一个进程对象,创建子进程时,只需要传入一个执行函数和函数的参数即可完成一个Process实例的创建,用start()方法启动进程,用join()方法实现进程间的同步。join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。


# -*- coding:utf-8 -*-

from multiprocessing import Process

import os

# 子进程要执行的代码

def run_proc(name):

    print 'Run child process %s (%s)...' % (name, os.getpid())

if __name__ == '__main__':

    print 'Parent process %s.' % os.getpid()

    p = Process(target=run_proc, args=('test',))

    print 'Process will start.'

    p.start()

    p.join()

    print 'Process end.'

得到:

Parent process 2533.

Process will start.

Run child process test (2534)...

Process end.

####multiprocessing模块提供了一个pool类来代表进程池对象

Pool可以提供指定数量的进程供用户调用,默认大小是cpu的核数,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求,但如果池的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束才会创建新的进程来处理它。


# -*- coding:utf-8 -*-

from multiprocessing import Pool

import os, time, random

def long_time_task(name):

    print 'Run task %s (%s)...' % (name, os.getpid())

    start = time.time()

    time.sleep(random.random() * 3)

    end = time.time()

    print 'Task %s runs %0.2f seconds.' % (name, (end - start))

if __name__ == '__main__':

    print 'Parent process %s.' % os.getpid()

    p = Pool()

    for i in range(5):

        p.apply_async(long_time_task, args=(i,))

    print 'Waiting for all subprocesses done...'

    p.close()

    p.join()

    print 'All subprocesses done.'

得到: 

Parent process 2541.

Waiting for all subprocesses done...

Run task 0 (2543)...

Run task 1 (2544)...

Run task 2 (2545)...

Run task 3 (2546)...

Task 0 runs 0.02 seconds.

Run task 4 (2543)...

Task 2 runs 0.60 seconds.

Task 4 runs 1.18 seconds.

Task 3 runs 1.26 seconds.

Task 1 runs 1.66 seconds.

All subprocesses done.

对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。

进程间的通信

Process之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。两者的区别在于Pipe常用于两个进程间的通讯而Queue用于多个进程间实现通讯。

Queue通讯

Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传输,有两个方法:put和get进行Queue操作。

  • put方法用以插入数据队列中它可以有两个可选参数:blocked和timeout,如果blocked为True(默认值)并且timeout是正值,该方法会阻塞timeout指定的时间,直到该队列有剩余空间,如果超时,会抛出Queue.Full异常,如果blocked为False,但该Queue已满,则会立即抛出Queue.Full异常。

  • Get方法用以从队列读取并且删除一个元素。它可以有两个可选参数:blocked和timeout,如果blocked为True(默认值)并且timeout是正值,那么在等待时间内没有取到任何元素会抛出Queue.Empty异常,如果blocked为False,分两种情况:如果Queue有一个值木口月禾,则立即返回该值,否则如果队列为空,则立即抛出Queuq.Empty异常。

# -*- coding:utf-8 -*-

from multiprocessing import Process, Queue

import os, time, random

# 写数据进程执行的代码:

def write(q):

    for value in ['A', 'B', 'C']:

        print 'Put %s to queue...' % value

        q.put(value)

        time.sleep(random.random())

# 读数据进程执行的代码:

def read(q):

    while True:

        value = q.get(True)

        print 'Get %s from queue.' % value

if __name__ == '__main__':

    # 父进程创建Queue,并传给各个子进程:

    q = Queue()

    pw = Process(target=write, args=(q,))

    pr = Process(target=read, args=(q,))

    # 启动子进程pw,写入:

    pw.start()

    # 启动子进程pr,读取:

    pr.start()

    # 等待pw结束:

    pw.join()

    # pr进程里是死循环,无法等待其结束,只能强行终止:

    pr.terminate()

得到:

Put A to queue...

Get A from queue.

Put B to queue...

Get B from queue.

Put C to queue...

Get C from queue.
Pipes通讯

Pipe常用来在两个进程间进行通信,两个进程分别位于管道的两端。

Pipe方法返回(conn1,conn2)代表一个管道的两个端,Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发,若duplex为False,conn1只负责接收消息,conn2只负责发送消息。send和recv方法分别是发送和接收消息的方法。例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError.


import multiprocessing

import random

import time, os

def proc_send(pipe, urls):

    for url in urls:

        print "process(%s) send:%s" % (os.getpid(), url)

        pipe.send(url)

        time.sleep(random.random())

def proc_recv(pipe):

    while True:

        print "Process(%s) rev:%s" % (os.getpid(), pipe.recv())

        time.sleep(random.random())

if __name__ == "__main__":

    pipe = multiprocessing.Pipe()

    p1 = multiprocessing.Process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10)]))

    p2 = multiprocessing.Process(target=proc_recv,args=(pipe[1],))

    p1.start()

    p2.start()

    p1.join()

    p2.join()

得到:

process(1134) send:url_0

Process(1135) rev:url_0

process(1134) send:url_1

Process(1135) rev:url_1

process(1134) send:url_2

Process(1135) rev:url_2

process(1134) send:url_3

Process(1135) rev:url_3

process(1134) send:url_4

Process(1135) rev:url_4

process(1134) send:url_5

Process(1135) rev:url_5

process(1134) send:url_6

Process(1135) rev:url_6

process(1134) send:url_7

Process(1135) rev:url_7

process(1134) send:url_8

Process(1135) rev:url_8

process(1134) send:url_9

Process(1135) rev:url_9

--结束END--

本文标题: Python的进程

本文链接: https://lsjlt.com/news/191517.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python的进程
    说明:本文是基于Py2.X环境,3.X在我电脑上出了些问题。两者差别并不大。 Python实现多进程的方式主要有两种:一种方法是使用os模块中的fork方法; 另一种是使用multiprocessing模块。这两种方法的区别在于前者仅...
    99+
    2023-01-31
    进程 Python
  • Python的进程及进程池详解
    目录进程进程和程序进程的状态Python中的进程创建⼦进程全局变量问题守护进程进程池总结进程 进程是操作系统分配资源的基本单元,是程序隔离的边界。 进程和程序 程序只是一组指令的集合...
    99+
    2024-04-02
  • Python--进程
    相关概念 进程 进程:正则进行的一个过程或者说一个任务,而负责执行任务的则是CPU。进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统基础的结构。早期面向进程设计的计算机结构中,进程是程序...
    99+
    2023-01-30
    进程 Python
  • python 进程
    #fork在window下不支持import os import time import sys  pid = os.fork() if pid == 0:#子进程         time.sleep(5)         print(...
    99+
    2023-01-31
    进程 python
  • Python进程
    Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。使用这些组件,可以方便地编写多进...
    99+
    2023-01-31
    进程 Python
  • Python的进程及进程池是什么
    这篇文章主要介绍了Python的进程及进程池是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。进程进程是操作系统分配资源的基本单元,是程序隔离的边界。进程和程序程序只是一组...
    99+
    2023-06-21
  • 如何进行Python进程的守护进程实施
    如何进行Python进程的守护进程实施,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python进程这一计算机语言在实际的应用中,如果你在实际应用的过程中遇到相...
    99+
    2023-06-17
  • Python进程锁和进程池
    进程锁进程与进程之间是独立的,为何需要锁?对于进程,屏幕的输出只有一个,此时就涉及到资源的竞争。在Linux的Python2.x中可能出现问题。这仅仅是一种情况,多个进程之间虽然是独立的,但仅限于内存和运算,如果涉及到其它一些资源,就可能存...
    99+
    2023-01-31
    进程 Python
  • Python进程、线程
    1.线程启动 def run(n): print('%s in thread...'%n) t=threading.Thread(target=run,args=(n,)) t.start #线程等待 t.join 2.多线程同时...
    99+
    2023-01-31
    线程 进程 Python
  • Python 进程,获取进程id( o
    import os pid=os.fork() #fork反复拷贝 if pid==0: print("A",os.getpid(),os.getppid()) else: print("B",os.getpid(),o...
    99+
    2023-01-31
    进程 Python id
  • Python 多进程
    #_*_coding:utf-8_*_ __author__ = 'jieli' import time import multiprocessing ''' 线程多锁是不需要当成参数传多,因为线程之间是共享内存多。 但是进程之间多锁...
    99+
    2023-01-31
    进程 Python
  • Python -- 多进程
    进程通信 方式一、共享内存(进程安全,效率高) 共享变量:multiprocessing.Value共享数组:multiprocessing.Array  方式二、Manager对象: Mananger 包括:list, dict, Na...
    99+
    2023-01-31
    进程 Python
  • python多进程
    第一种开启进程方式#!/usr/bin/python # -*- coding:utf-8 -*- from multiprocessing import Process import time, random, os # print(o...
    99+
    2023-01-31
    进程 python
  • python之线程、进程
      进程:资源的集合  线程:操作CPU的最小调试单位    最简单的多线程实例如下:#!/usr/bin/python #Author:sean #线程有2种调用方式,如下: #直接调用 import threading import ...
    99+
    2023-01-31
    线程 进程 python
  • python多进程编程
    最近开始学习PYTHON编程语言,详细参照《python绝技运用Python成为顶级***》。在学习过程第一章节中,编写破解LINUX shadow文件时,想利用多线程加快破解速度。主机运行环境为WINDOWS下的VM WORKSTATIO...
    99+
    2023-01-31
    进程 python
  • Python进程/线程/协程
    第1章 操作系统历史1.1为什么要有操作系统?程序员无法把所有的硬件操作细节全部了解到,管理这些硬件并且加以优化使用时非常繁琐的工作,这个繁琐的工作就是由操作系统来干的,有了它,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件...
    99+
    2023-01-31
    线程 进程 Python
  • Python全栈的进程和守护进程是怎样的
    这期内容当中小编将会给大家带来有关Python全栈的进程和守护进程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 理解进程进程的概念:(process)进程就是正在运行的程序,它是操作系统中,...
    99+
    2023-06-22
  • 简述Python中的进程、线程、协程
    进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由...
    99+
    2022-06-04
    线程 进程 Python
  • Python 中的进程、线程、协程、同步
    进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生?在刚刚结束的 PyCon2014 上海站,来自七牛云存储的 Python 高级工程师许智翔带来了关于 Python 的分享《Pyt...
    99+
    2023-01-31
    线程 进程 Python
  • 详解Python中的进程和线程
    进程是什么? 进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作