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

Python进程

进程Python 2023-01-31 02:01:50 484人浏览 独家记忆

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

摘要

python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。使用这些组件,可以方便地编写多进

python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。使用这些组件,可以方便地编写多进程并发程序。

多进程实例:

import os
from multiprocessing import Process

def info(title):
   print(title)
   print('module name:', __name__)
   print('parent process:', os.getppid())
   print('process id:', os.getpid())
   print("\n\n")

def f(name):
   info('\033[31;1mfunction f\033[0m')
   print('hello', name)

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

实例化一个Process必须要指定target和args。target是新的进程的入口方法,可以认为是main方法。args是该方法的参数列表。启动进程类似于启动Thread,必须要调用start方法。也可以继承Process,覆盖run方法,在run方法中实现该进程的逻辑。调用join方法会阻塞当前调用进程,直到被调用进程运行结束。

手工终止一个进程可以调用terminate方法,在UNIX系统中,该方法会发送SIGTERM信号量,而在windows系统中,会借助TerminateProcess方法。需要注意的是,exit处理逻辑并不会被执行,该进程的子进程不会被终止,他们只会变成孤儿进程。

进程间通讯

Queue

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

get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常。Queue的一段示例代码:

from multiprocessing import Process, Queue

def f(q):
   q.put([42, None, 'hello'])

if __name__ == '__main__':
   q = Queue()
   p = Process(target=f, args=(q,))
   p2 = Process(target=f, args=(q,))
   p.start()
   p2.start()
   print('data1:',q.get())    # prints "[42, None, 'hello']"
   print('data2:',q.get())
   p.join()

Pipes

Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息。

send和recv方法分别是发送和接受消息的方法。例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError。

from multiprocessing import Process, Pipe

def send(conn):
   conn.send("Hello World")
   conn.close()

if __name__ == '__main__':
   parent_conn, child_conn = Pipe()
   p = Process(target=send, args=(child_conn,))
   p.start()
   print(parent_conn.recv())

Managers

from multiprocessing import Process, Manager

def f(d, l):
   d[1] = '1'
   d['2'] = 2
   d[0.25] = None
   l.append('a')
   print(l)

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()

       print(d)
       print(l)

进程同步

multiprocessing包提供了Condition, Event, Lock, RLock, Semaphore等组件可用于同步。下面是使用Lock的一个示例:

from multiprocessing import Process, Lock

def f(l, i):
   l.acquire()
   try:
       print('hello world', i)
   finally:
       l.release()

if __name__ == '__main__':
   lock = Lock()

   for num in range(10):
       Process(target=f, args=(lock, num)).start()

进程池  

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

  • apply

  • apply_async

from  multiprocessing import Process,Pool,freeze_support
import time

def Foo(i):
   time.sleep(2)
   return i+100

def Bar(arg):
   print('-->exec done:',arg)


if __name__ == '__main__':
       freeze_support()
       pool = Pool(3)  
       for i in range(10):
           pool.apply_async(func=Foo, args=(i,),callback=Bar)  # 异步
           #pool.apply(func=Foo, args=(i,))    # 同步无回调机制

       print('end')
       pool.close()
       pool.join()  #进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。



--结束END--

本文标题: Python进程

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

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

猜你喜欢
  • 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进程锁和进程池
    进程锁进程与进程之间是独立的,为何需要锁?对于进程,屏幕的输出只有一个,此时就涉及到资源的竞争。在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的进程
    说明:本文是基于Py2.X环境,3.X在我电脑上出了些问题。两者差别并不大。 Python实现多进程的方式主要有两种:一种方法是使用os模块中的fork方法; 另一种是使用multiprocessing模块。这两种方法的区别在于前者仅...
    99+
    2023-01-31
    进程 Python
  • 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中的进程创建⼦进程全局变量问题守护进程进程池总结进程 进程是操作系统分配资源的基本单元,是程序隔离的边界。 进程和程序 程序只是一组指令的集合...
    99+
    2024-04-02
  • 初遇python进程
    计算机硬件组成   主板    固化(寄存器,是直接和cpu进行交互的一个硬件)   cpu     中央处理器:计算(数字计算和逻辑计算)和控制(控制所有硬件协调工作)   存储    硬盘,内存   输入设备  键盘,鼠标,话筒   ...
    99+
    2023-01-30
    进程 初遇 python
  • python之多进程
    一、multiprocessing模块 python中的多线程无法利用多核优势,如果想要充分地使用多核cpu的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。python提供了multiprocessi...
    99+
    2023-01-30
    之多 进程 python
  • python多进程—multiproce
    一、进程    python中提供多进程包:multiprocessing,支持子进程,通信,共享内存,执行不同形式的同步,提供了Process、Pipi、Lock等组件    多进程和多线程区别:  多线程使用的是CPU的一个核,适合IO...
    99+
    2023-01-31
    进程 python multiproce
  • python fork()多进程
    一、理解fork() fork()是一个绝对唯一的调用。Python中的大多数函数会之返回一次,因为sys.exit()会终止程序,所以它就不会返回。相比之下,Python的os.fork()是唯一返回两次的函数,任何返回两次的函数,在某...
    99+
    2023-01-31
    进程 python fork
  • Python进程学习
    线程及进程概念可自行学习 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后...
    99+
    2023-01-31
    进程 Python
  • Python 守护进程
     nohup 可以使程序后台运行不受终端影响,但想使程序运行后就脱离终端Python需要用到os.fork来实现,例子如下: daemonize.py #!/usr/bin/python #coding:utf-8  import sys ...
    99+
    2023-01-31
    进程 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作