python多进程编程(模式与锁)

这篇具有很好参考价值的文章主要介绍了python多进程编程(模式与锁)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

multiprocessing的三种模式

  • fork,【拷贝几乎所有资源】【支持文件对象/线程锁等传参】【unix】【任意位置开始】【快】
  • spawn,【run参数传参必备资源】【不支持文件对象/线程锁等传参】【unix、win】【main代码块开始】【慢】
  • forkserver,【run参数传必备资源】【不支持文件对象/线程锁传参】【部分unix】【main代码块开始】
import multiprocessing
multiprocessing.set_start_method('spawn')

python多进程编程(模式与锁),python并发编程,python

官方文档https://docs.python.org/zh-cn/3/library/multiprocessing.html

进程锁

  • Lock类与RLock类相同:由于进程之间随机调度:某进程可能执行n条后,CPU接着执行其他进程。为了多个进程同时操作一个内存中的资源时不产生混乱,我们使用锁。

  • Lock类与RLock类的区别:无论是Lock还是RLock,提供的方法都非常简单,acquire和release。但是Lock和RLock的区别是什么呢?RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的锁。

def work(filename, max_count):
    for n in range(max_count):
        f = open(filename, "r")
        try:
            nbr = int(f.read())
        except ValueError as err:
            print ("File is empty, starting to count from 0, error: " + str(err))
            nbr = 0
        f = open(filename, "w")
        f.write(str(nbr + 1) + '\n')
        f.close()


if __name__ == '__main__':
    work('demo.txt', 5)

# 输出
File is empty, starting to count from 0, error: invalid literal for int() with base 10: ''

Process finished with exit code 0

工作函数被调用了 5 次,正如所期望的那样,它计数正确,没有损失任何数据。在第一次读取时,见到了一个空文件。这会为 int()抛出 invalid literal for int()的
错误(因为在一个空字符串上调用了 int())。这个错误只发生了一次,之后,我们总是会有一个合法的值用于读取并把它转变成一个整数。

def run_one_work(filename, lock):
    lock.acquire()
    f = open(filename, "r")
    try:
        nbr = int(f.read())
    except ValueError as err:
        print("File is empty, starting to count from 0, error: " + str(err))
        nbr = 0
    f = open(filename, "w")
    f.write(str(nbr + 1) + '\n')
    f.close()
    lock.release()


if __name__ == '__main__':
    multiprocessing.set_start_method("spawn")
    lock = multiprocessing.Lock()
    file_name = 'demo.txt'
    for i in range(5):
        p = multiprocessing.Process(target=run_one_work, args=(file_name,lock,))
        p.start()
        p.join()
    time.sleep(7)
# spawn模式需要特殊处理
process_list = []
for i in range(5):
    multiprocessing.Process(target=run_one_work, args=(file_name,lock,))
    p.start()
    process_list.append(p)
for p in process_list:
    p.join()

锁实例程序:文章来源地址https://www.toymoban.com/news/detail-610930.html

from multiprocessing import Process
from multiprocessing import Lock
import time
import json

def show_ticket(i):
    time.sleep(0.1)
    with open('ticket') as f:
        dic = json.load(f)
        print('余票: %s' %dic.get('ticket'))

def buy_ticket(i, lock):
    lock.acquire() #加锁
    with open('ticket') as f:
        dic = json.load(f)
        time.sleep(0.1)
        if dic.get('ticket') >0:
            dic['ticket'] -= 1
            print('\033[32m%s买到票了\033[0m' %i)
        else:
            print('\033[31m%s没买到票\033[0m' %i)
    time.sleep(0.1)
    with open('ticket', 'w')as f:
        json.dump(dic, f)
    lock.release() #释放锁
if __name__ == '__main__':
    for i in range(10):
        p = Process(target=show_ticket, args=(i,) )
        p.start()
    lock = Lock()
    for i in range(10):
        p1 = Process(target=buy_ticket, args=(i,lock))
        p1.start()

到了这里,关于python多进程编程(模式与锁)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • < Python全景系列-5 > 解锁Python并发编程:多线程和多进程的神秘面纱揭晓

    欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。   这是本系列的第五

    2024年02月05日
    浏览(29)
  • 多线程、协程和多进程并发编程

    37.1 如何通俗理解线程和进程? 进程:进程就是正在执⾏的程序。 线程:是程序执⾏的⼀条路径, ⼀个进程中可以包含多条线程。 通俗理解:例如你打开抖⾳,就是打开⼀个进程,在抖⾳⾥⾯和朋友聊天就是开启了⼀条线程。 再举⼀个例⼦: 在某⻝堂打饭的时候,此⻝堂安

    2024年02月02日
    浏览(88)
  • 多线程|多进程|高并发网络编程

    多进程并发服务器是一种经典的服务器架构,它通过创建多个子进程来处理客户端连接,从而实现并发处理多个客户端请求的能力。 概念: 服务器启动时,创建主进程,并绑定监听端口。 当有客户端连接请求时,主进程接受连接,并创建一个子进程来处理该客户端连接。

    2024年02月07日
    浏览(29)
  • JUC并发编程学习笔记(一)认知进程和线程

    进程 一个程序,如QQ.exe,是程序的集合 一个进程往往可以包含多个线程,至少包含一个 java默认有两个线程,GC垃圾回收线程和Main线程 线程:一个进程中的各个功能 java无法真正的开启线程,因为java是运行在虚拟机上的,所以只能通过C++,通过native本地方法调用C++开启线程

    2024年02月06日
    浏览(37)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(44)
  • 《TCP/IP网络编程》阅读笔记--并发多进程服务端的使用

    目录 1--并发服务器端 2--进程 2-1--进程的相关概念 2-2--fork()创建进程 2-3--僵尸进程 2-4--wait()和waitpid()销毁僵尸进程 3--信号处理 3-1--signal()函数 3-2--sigaction()函数 3--3--利用信号处理技术消灭僵尸进程 4--基于多任务的并发服务器 5--分割 TCP 的 I/O 程序 并发服务器端主要有以下三类

    2024年02月09日
    浏览(28)
  • Linux高并发服务器开发---笔记1(环境搭建、系统编程、多进程)

    0613 首先这整个系列笔记属于笔记①:牛客校招冲刺集训营—C++工程师中的 第四章 笔记。 视频课链接: 视频1:Linux高并发服务器开发(40h); 视频2:第4章 项目制作与技能提升(录播)(26h30min); 视频课3: 第5章 高频考点与真题精讲(录播)中的 5.10-5.13 项目回顾 有个学

    2024年02月15日
    浏览(45)
  • 计算机网络编程 | 并发服务器代码实现(多进程/多线程)

    欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 专栏:《网络编程》 当涉及到构建高性能的服务

    2024年02月08日
    浏览(46)
  • Linux中 socket编程中多进程/多线程TCP并发服务器模型

    一次只能处理一个客户端的请求,等这个客户端退出后,才能处理下一个客户端。 缺点:循环服务器所处理的客户端不能有耗时操作。 模型 源码 可以同时处理多个客户端请求 父进程 / 主线程专门用于负责连接,创建子进程 / 分支线程用来与客户端交互。 模型 源码 模型 源

    2024年02月12日
    浏览(31)
  • 多进程并发TCP服务器模型(含客户端)(网络编程 C语言实现)

    摘要 :大家都知道不同pc间的通信需要用到套接字sockte来实现,但是服务器一次只能收到一个客户端发来的消息,所以为了能让服务器可以接收多个客户端的连接与消息的传递,我们就引入了多进程并发这样一个概念。听名字就可以知道--需要用到进程,当然也有多线程并发

    2024年02月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包