python多进程

简介:   1、Process类 from multiprocessing import Process def func(name): print('hello', name) if __name__ == '__main__': p = Process(target=func, args=('bob',)) p.

 

 

1、Process类

from multiprocessing import Process

def func(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=func, args=('bob',))
    p.start()
    p.join()

 

 

2、上下文和开始方法

开始方法

import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    mp.set_start_method('spawn')
    q = mp.Queue()
    p = mp.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()

 

上下文

import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    q = ctx.Queue()
    p = ctx.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()

 

 

3、进程间交换对象

Queues

from multiprocessing import Process, Queue

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

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

 

Pipes

from multiprocessing import Process, Pipe

def func(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=func, args=(child_conn,))
    p.start()
    print(parent_conn.recv())   # prints "[42, None, 'hello']"
    p.join()

 

 

4、进程间同步

例如你可以使用一个锁来确保只有一个进程打印到标准输出

from multiprocessing import Process, Lock

def func(lock, i):
    lock.acquire()
    try:
        print('hello world', i)
    finally:
        lock.release()

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

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

 

 

5、进程间共享状态

Shared memory

使用 Value 或 Array,数据可以存储在一个共享内存映射 。例如,下面的代码

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])

参数' d '表示双精度浮点数,参数“i”表示一个带符号整数。这些共享对象将进程和线程安全的。

 

Server process

通过 Manager() ,返回一个管理器对象,用以控制持有Python对象的服务进程,并允许其他进程使用代理来操作它们。

通过 Manager() 返回的管理器对象支持的类型有:list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.

from multiprocessing import Process, Manager

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

if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(10))

        p = Process(target=f, args=(d, l))
        p.start()
        p.join()

        print(d)
        print(l)

服务进程管理器比使用共享内存对象更加灵活,因为他们可以支持任意的对象类型。同样,一个管理器可以在不同的电脑通过网络共享的过程。然而,他们慢于使用共享内存。

 

 

6、使用进程池

from multiprocessing import Pool
from time import sleep

def f(x):
    return x*x

if __name__ == '__main__':
    # start 4 worker processes
    with Pool(processes=4) as pool:

        # print "[0, 1, 4,..., 81]"
        print(pool.map(f, range(10)))

        # print same numbers in arbitrary order
        for i in pool.imap_unordered(f, range(10)):
            print(i)

        # evaluate "f(10)" asynchronously
        res = pool.apply_async(f, [10])
        print(res.get(timeout=1))             # prints "100"

        # make worker sleep for 10 secs
        res = pool.apply_async(sleep, [10])
        print(res.get(timeout=1))             # raises multiprocessing.TimeoutError

    # exiting the 'with'-block has stopped the pool

 

目录
相关文章
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
866 0
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
984 1
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
消息中间件 JSON 自然语言处理
Python多进程日志以及分布式日志的实现方式
python日志模块logging支持多线程,但是在多进程下写入日志文件容易出现下面的问题: PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。 也就是日志文件被占用的情况,原因是多个进程的文件handler对日志文件进行操作产生的。
|
数据采集 并行计算 安全
Python并发编程:多进程(multiprocessing模块)
在处理CPU密集型任务时,Python的全局解释器锁(GIL)可能会成为瓶颈。为了充分利用多核CPU的性能,可以使用Python的multiprocessing模块来实现多进程编程。与多线程不同,多进程可以绕过GIL,使得每个进程在自己的独立内存空间中运行,从而实现真正的并行计算。
|
Python
python Process 多进程编程
python Process 多进程编程
266 1
|
存储 安全 Python
[python]使用标准库logging实现多进程安全的日志模块
[python]使用标准库logging实现多进程安全的日志模块
900 1
|
消息中间件 存储 Python
详解Python TimedRotatingFileHandler多进程环境下的问题和解决方法
`TimedRotatingFileHandler`在单进程应用中非常有用,但在多进程环境下直接使用可能会遇到挑战。以上提到的方案可以根据具体情况选取,解决在多进程环境下的日志文件管理问题。综合考虑,采用外部日志管理工具或集中式日志记录方案通常更为稳健和有效,尤其适用于大型或复杂的系统架构。
1057 3
|
数据采集 Python
Python多进程:如何在不依赖Queue的情况下传递结果
本文探讨了在Python中使用多进程技术采集抖音短视频数据时,如何在不依赖队列(Queue)的情况下传递结果。文章首先介绍了多进程提高数据采集效率的背景,然后指出了队列在处理大量数据时可能成为性能瓶颈,并增加了系统复杂性。作为解决方案,提出了使用管道、共享内存和临时文件等替代方法。文章通过一个实战案例,详细演示了如何配置爬虫代理、设置请求头、实现定时器装饰器、抓取视频数据以及通过管道在子进程间传递结果。最后,文章总结了使用这些替代方案可以有效提高数据采集的效率和可靠性。
270 0
Python多进程:如何在不依赖Queue的情况下传递结果

推荐镜像

更多