Python编程:multiprocessing多进程

简介: Python编程:multiprocessing多进程

获取进程id

import multiprocessing
import os
def foo():
    print(__name__)
    print("parent:", os.getppid())
    print("current:", os.getpid())
if __name__ == "__main__":
    foo()  # 主进程调用
    p = multiprocessing.Process(target=foo)
    p.start()  # 新开进程调用
    """
    __main__
    parent: 952
    current: 188
    __mp_main__
    parent: 188
    current: 6492
    """

多进程测试

import multiprocessing
import time, threading
from pycharm_fontcolor import Colors, FontColor
def func(i):
    print(FontColor.set_color("线程号:{}".format(threading.get_ident()), Colors.green), i)
def foo(i):
    print(FontColor.set_color("进程:", Colors.red), i)
    t = threading.Thread(target=func, args=(i,))  # 进程中新开线程
    t.start()
if __name__ == "__main__":
    start_time = time.time()
    for i in range(5):
        p = multiprocessing.Process(target=foo, args=(i,))
        p.start()
    end_time = time.time()
    print(FontColor.set_color("时间:", Colors.blue), end_time - start_time)
    """
    时间: 0.05303597450256348
    进程: 0
    线程号:8968 0
    进程: 1
    线程号:7620 1
    进程: 2
    进程: 3
    线程号:9204 2
    线程号:2492 3
    进程: 4
    线程号:6512 4
    """

备注:

pycharm_fontcolor是自己写的模块,可以参考文章:

Python编程:pycharm控制台字体颜色


进程池

from multiprocessing import  Pool
import time, os
def foo(i):
    time.sleep(2)
    print("process:", i, os.getpid())
    return i + 1  # 参数将传递给回调函数
def bar(i): # 做回调函数,由主进程执行
    print("bar", i, os.getpid())
if __name__ == "__main__":
    print(os.getpid())
    pool = Pool(processes=3)  # 允许同时放入3个进程
    for i in range(10):
        # p = pool.apply(func=foo, args=(i,))  # 串行
        p = pool.apply_async(func=foo, args=(i,), callback=bar)  # 并行
    print("done")
    pool.close()  # 先关闭入口
    pool.join()  # 在等待执行
    """
    8120
    done
    process: 0 5452
    bar 1 8120
    process: 1 8360
    bar 2 8120
    process: 2 7908
    bar 3 8120
    process: 3 5452
    bar 4 8120
    process: 4 8360
    bar 5 8120
    process: 5 7908
    bar 6 8120
    process: 6 5452
    bar 7 8120
    process: 7 8360
    bar 8 8120
    process: 8 7908
    bar 9 8120
    process: 9 5452
    bar 10 8120
    """

进程队列

from multiprocessing import Process, Queue
def foo(q):
    q.put("你好")
if __name__ == "__main__":
    q = Queue()  # 进程队列
    p = Process(target=foo, args=(q,))
    # p = Thread(target=foo, args=(q,))
    p.start()
    print(q.get())  # 你好

进程管道

from multiprocessing import Process, Pipe
def foo(conn):
    conn.send("hello")
    conn.close()
if __name__ == "__main__":
    parent_conn, child_conn = Pipe()  # 管道传送数据
    p = Process(target=foo, args=(child_conn,))
    p.start()
    print(parent_conn.recv())  # hello

多进程实现数据共享

from multiprocessing import Process, Manager
import os
def foo(dct, lst):
    dct[os.getpid()] = os.getpid()
    lst.append(os.getpid())
    print(os.getpid())
if __name__ == "__main__":
    manager = Manager()  # 实现进程间共享数据
    dct = manager.dict()
    lst = manager.list()
    processes = []
    for i in range(5):
        p = Process(target=foo, args=(dct, lst))
        p.start()
        processes.append(p)
    for process in processes:  # 等待结果
        process.join()
    print(dct)
    print(lst)
    """
    3816 5376 7500 8332 1124
    {3816: 3816, 5376: 5376, 8332: 8332, 7500: 7500, 1124: 1124}
    [3816, 5376, 7500, 8332, 1124]
    """

进程锁

from multiprocessing import Lock, Process
def foo(lock, i):
    lock.acquire()
    print("hello world!", i)
    lock.release()
if __name__ == "__main__":  # 主动执行会继续下面的内容,被当做模块调用则不会
    lock = Lock()  # 实例化进程锁
    for i in range(5):
        p = Process(target=foo, args=(lock, i))
        p.start()
    """
    hello world! 2
    hello world! 1
    hello world! 0
    hello world! 3
    hello world! 4
    """


相关文章
|
5月前
|
Unix Linux Python
114 python高级 - multiprocessing
114 python高级 - multiprocessing
19 0
|
2月前
|
安全 Python
python多进程multiprocessing使用
如果你想在python中使用线程来实现并发以提高效率,大多数情况下你得到的结果是比串行执行的效率还要慢;这主要是python中GIL(全局解释锁)的缘故,通常情况下线程比较适合高IO低CPU的任务,否则创建线程的耗时可能比串行的还要多。GIL是历史问题,和C解释器有关系。 为了解决这个问题,python中提供了多进程的方式来处理需要并发的任务,可以有效的利用多核cpu达到并行的目的。【2月更文挑战第5天】
47 0
|
2月前
|
并行计算 程序员 API
Python多进程编程:利用multiprocessing模块实现并行计算
Python多进程编程:利用multiprocessing模块实现并行计算
|
3月前
|
安全 Python Windows
Python 的并发编程:在 Python 中如何使用 `threading` 和 `multiprocessing` 模块?
Python 的并发编程:在 Python 中如何使用 `threading` 和 `multiprocessing` 模块?
|
10月前
|
存储 安全 Unix
Python 标准类库-并发执行之multiprocessing-基于进程的并行 2
Python 标准类库-并发执行之multiprocessing-基于进程的并行
219 0
|
10月前
|
安全 Unix 程序员
Python 标准类库-并发执行之multiprocessing-基于进程的并行 1
Python 标准类库-并发执行之multiprocessing-基于进程的并行
108 1
|
10月前
|
机器学习/深度学习 Python
Python应用专题 | 12:用 multiprocessing 处理海量任务
面对海量任务需要高效对其进行消费,而任务之间不存在处理结果的相互依赖,这时可以尝试使用multiprocessing。
|
Java 数据库 芯片
物无定味适口者珍,Python3并发场景(CPU密集/IO密集)任务的并发方式的场景抉择(多线程threading/多进程multiprocessing/协程asyncio)
一般情况下,大家对Python原生的并发/并行工作方式:进程、线程和协程的关系与区别都能讲清楚。甚至具体的对象名称、内置方法都可以如数家珍,这显然是极好的,但我们其实都忽略了一个问题,就是具体应用场景,三者的使用目的是一样的,换句话说,使用结果是一样的,都可以提高程序运行的效率,但到底那种场景用那种方式更好一点?
物无定味适口者珍,Python3并发场景(CPU密集/IO密集)任务的并发方式的场景抉择(多线程threading/多进程multiprocessing/协程asyncio)
|
Python
multiprocessing库:Python像线程一样管理进程(二)
multiprocessing库:Python像线程一样管理进程(二)
106 1
multiprocessing库:Python像线程一样管理进程(二)
|
API Python Windows
multiprocessing库:Python像线程一样管理进程(一)
multiprocessing库:Python像线程一样管理进程(一)
131 1
multiprocessing库:Python像线程一样管理进程(一)

热门文章

最新文章