专栏首页python3Python进程锁和进程池

Python进程锁和进程池

进程锁

进程与进程之间是独立的,为何需要锁?

对于进程,屏幕的输出只有一个,此时就涉及到资源的竞争。在Linux的Python2.x中可能出现问题。

这仅仅是一种情况,多个进程之间虽然是独立的,但仅限于内存和运算,如果涉及到其它一些资源,

就可能存在竞争问题,在实际使用过程中要注意思考和防范错误。

from multiprocessing import Process, Lock
def func(lock, i):
    lock.acquire()
    print("hello,", i)
    lock.release()

if __name__ == "__main__":
    lock = Lock()
    for number in range(10):
        Process(target=func, args=(lock, number)).start()

进程池

进程的启动,是克隆的过程,某些情况下可能开销过大,所以需要引用“进程池”。

from multiprocessing import Process, Pool
import os, time

def foo(i):
    time.sleep(2)
    print("in foo", os.getpid())
    return i + 100

if __name__ == "__main__":
    pool = Pool(5)  # 允许进程池里同时放入5个进程
    for i in range(10):
        # pool.apply(func=foo, args=(i,))  # 同步执行,或者叫串行执行
        pool.apply_async(func=foo, args=(i,))  # 异步执行
    print('main end')
    pool.close()
    pool.join()  # 注意,这里要先close,然后再调用join,否则异步执行的线程池不会执行

注意,程序的执行结果是先打印main end,然后再打印新进程的显示。

from multiprocessing import Process, Pool
import os, time

def foo(i):
    time.sleep(2)
    print("in foo", os.getpid())
    return i + 1000

def bar(args):
    print("processes finished", args)

if __name__ == "__main__":
    pool = Pool(5)  # 允许进程池里同时放入5个进程
    for i in range(10):
        pool.apply_async(func=foo, args=(i,), callback=bar) # 带回调的进程
    print('main end')
    pool.close()
    pool.join()  # 注意,这里要先close,然后再调用join,否则异步执行的线程池不会执行
# 带callback的例子:主进程一直链接数据库,子进程执行完之后,通过回调写入数据库,不用再次链接
# 数据库,提高了效率,减少了资源浪费。
# 需要注意的是回调函数是主进程调用的,而且参数是进程函数的返回值。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅谈3A和进程

    3计帐(Accounting):记录用户对各种网络服务的用量,并提供给计费系统。整个系统在网络管理与安全问题中十分有效。

    py3study
  • 初遇python进程

      cpu     中央处理器:计算(数字计算和逻辑计算)和控制(控制所有硬件协调工作)

    py3study
  • 【Python】Python-pool的

    默认情况下,Pool会创建固定数目的工作进程,并向这些工作进程传递作业,直到再没有更多作业为止。

    py3study
  • 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    cluster模块是node.js中用于实现和管理多进程的模块。常规的node.js应用程序是单线程单进程的,这也意味着它很难充分利用服务器多核CPU的性能,而...

    大史不说话
  • Linux并发(进程裂变)

    进程的分裂跟细胞的分裂几乎一致,一个进程通过fork函数来自我复制,新出现的子进程拥有跟父进程几乎一样的外表和内在。

    用户2617681
  • 守护进程

    我们知道linux有许多自带的守护进程,比如syslogd、crond、sendmail等。那用户或开发者自己编写的程序为什么也需要成为守护进程呢?

    wytheZ
  • linux利用shell实现守护进程的脚本

    转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)

    帘卷西风
  • 速读原著-TCP/IP(Telnet举例)

    在这里我们将介绍在三种不同的操作方式下 Te l n e t选项协商的情况。这些方式包括:单字符方式、实行方式和准行方式。同样我们还将讨论当用户在服务器端按了中...

    cwl_java
  • python网络-多进程(21)

    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中...

    Se7eN_HOU
  • python3--中的进程操作--multiprocess模块

    运行中的程序就是一个进程。所有的进程都是通过它的父进程来创建的。因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程。多个进程可以实现...

    py3study

扫码关注云+社区

领取腾讯云代金券