并发编程 之 进程 之 进程的模型: 进程同步的工具 (三) 继 创建进程( 守护进程)

multiProcessing 包中 Process模块:

  join() 堵塞问题, 可以理解为:  相当于 每个子进程结束时都会给 父进程发一条消息, join() 则是接收,内部有socket的实现

  1, 进程之间的数据隔离问题
    进程和进程之间的数据是隔离的, 内存空间不能共享,所以要想进行通信, 必须借助其他方法. 且这两个进程都是自愿的.
    父子进程之间通过socket 通信.
  2, 守护进程:
    daemon = True 守护进程的属性, 默认是 False 如果 设置成True 就表示设置这个子进程为一个守护进程. 且 设置守护进程的操作应该字开启子进程之前.
    守护进程会在主进程的代码执行完毕之后直接结束, 无论守护进程是否执行完毕.  *******

 1 def func1():
 2     print(‘begin‘)
 3     time.sleep(3)
 4     print(‘wahaha‘)
 5
 6 if __name__ == ‘__main__‘:
 7     p = Process(target=func1)
 8     p.daemon = True
 9     # 守护进程的属性,默认是False,如果设置成True,就表示设置这个子进程为一个守护进程
10     # 设置守护进程的操作应该在开启子进程之前
11     p.start()
12
13     time.sleep(1)
14     print(‘主进程‘)
15
16 ‘‘‘
17 输出结果:
18 bigin
19 主进程
20 ‘‘‘

守护进程的例子(一)

    主要应用于: 报活: 报 主进程还活着.

 1 def func1():
 2     print(‘begin‘)
 3     time.sleep(3)
 4     print(‘wahaha‘)
 5
 6 def func2():
 7     while True:
 8         print(‘in func2‘)
 9         time.sleep(0.5)
10
11 if __name__ == ‘__main__‘:
12     Process(target=func1).start()
13     p = Process(target=func2)
14     p.daemon = True
15     p.start()
16     time.sleep(1)
17     print(‘主进程‘)
18 ‘‘‘
19 输出结果:
20 begin
21 in func2
22 in func2
23 主进程
24 wahaha         # 在等待打印 ‘wahaha‘的时候 不会再次执行 守护进程的内容
25 ‘‘‘

守护进程的例子(二)

小结: 进程: 同一时刻可以做多件事情, 互相之间不影响.

进程的模型: 进程同步的工具.    ps: 有先后顺序 就是同步, 进程之间都是异步的,

  1. 锁 Lock模块: 保证一段代码,在同一时刻只能被一个进程执行.
    lock = Lock()    创造了一把锁
    acquire()       获取锁的钥匙
    release()    归还这把锁的钥匙
  ps: 多进程的数据的不安全性: 当多个进程共享一段数据的时候, 数据会出现不安全的现象, 需要加锁, 来维护数据的安全性.

 1 # 代码中涉及到一个 dp文件, 此文件用来单纯的模拟 其他机器上公用的数据库
 2
 3 ‘‘‘
 4 抢票分析:
 5 1, 客户可以同一时间访问服务器,并且访问到 同一个余票数
 6 2, 当客户发出购买请求, 服务器必须进行同步处理, 一个一个来.
 7 问: 如何在 并行异步的程序里,实现同步处理某一个功能
 8 ‘‘‘
 9
10
11 import json
12 import time
13 from multiprocessing import Lock
14 from multiprocessing import Process
15 def search(i):
16     with open(‘db‘,‘r‘) as f:count_dic = json.load(f)
17     time.sleep(0.2)
18     print(‘person %s 余票 : %s张‘%(i,count_dic[‘count‘]))
19
20 def buy(i):
21     with open(‘db‘,‘r‘) as f:count_dic = json.load(f)
22     time.sleep(0.2)
23     if count_dic[‘count‘] > 0:
24         count_dic[‘count‘] -= 1
25         print(‘person %s 购票成功‘%i)
26     time.sleep(0.2)
27     with open(‘db‘,‘w‘) as f:json.dump(count_dic,f)
28
29 def task(i,lock):
30     search(i)
31     lock.acquire()   # 如果之前已经被acquire了 且 没有被release 那么进程会在这里阻塞
32     buy(i)
33     lock.release()
34
35 if __name__ == ‘__main__‘:
36     lock = Lock()
37     for i in range(10):
38         p = Process(target=task,args=(i,lock))
39         p.start()

lock 抢票的例子

  2, 信号量 Semaphore模块: 多把钥匙 对应一把锁

    本质就是: lock+count 计数 来实现的

  3, 事件 Event模块:

    标志:在 事件创立之初,标志默认为False

    wait(timeout=None) 等待 有一个关键字参数 timeout(超时) 以秒为单位.
      1, 阻塞, 如果标志为False 就是 阻塞
      2, 非阻塞, 如果标志为True 就是 非阻塞
    is_set() 查看标志
    set() 修改标志的值为True
    clear() 修改标志的值为False

 1 import time
 2 import random
 3 from multiprocessing import Event,Process
 4
 5 def traffic_light(e):
 6     print(‘\033[1;31m 红灯亮\033[0m‘)
 7     while True:
 8         time.sleep(2)
 9         if e.is_set():
10             print(‘\033[1;31m 红灯亮\033[0m‘)
11             e.clear()
12         else:
13             print(‘\033[1;32m 绿灯亮\033[0m‘)
14             e.set()
15
16
17 # 车 等或者通过
18 def car(id,e):
19     if not e.is_set():
20         print(‘car %s 等待‘ % id)
21         e.wait()
22     print(‘car %s 通过‘%id)
23
24 def police_car(id,e):
25     if not e.is_set():
26         e.wait(timeout = 0.5)
27     print(‘police car %s 通过‘ % id)
28
29 # 主进程 启动交通控制灯 启动车的进程
30 if __name__ == ‘__main__‘:
31     e = Event()
32     p = Process(target=traffic_light,args=(e,))
33     p.start()
34     car_lst = [car,police_car]
35     for i in range(20):
36         p = Process(target=random.choice(car_lst), args=(i,e))
37         p.start()
38         time.sleep(random.randrange(0,3,2))

红绿灯模型事件

原文地址:https://www.cnblogs.com/Fushengliangnian/p/9366078.html

时间: 2024-10-12 16:21:58

并发编程 之 进程 之 进程的模型: 进程同步的工具 (三) 继 创建进程( 守护进程)的相关文章

创建一个守护进程

一.概述:守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是随系统启动而存在,随系统关闭而消失的进程(也就是开机之后就会存在,关机才消失).守护进程是一种很有用的进程,Linux的大多数服务器就是用守护进程实现的. 在终端运行命令:ps axj | head 参数a表示不仅列出当前用户进程,也列出所有其它用户进程. 参数x表示不仅列出有控制终端的进程,也列出所有无控制终端的进程. 参数j表示列出与作业控制

适用于即时系统并发编程的新的java线程模型,记我的第一篇英文翻译

1:介绍:      传统意义上的即时系统是有经验的专家的领域,因为他们能处理多种定制的内核,非标准的并且大多数是低级的语言,供应商提供的定制的I/O接口.这就要求有一种新的java线程模型来解决这种状况,这种模型解决当前及时嵌入系统的四个缺陷:安全,性能,可移植性.程序调试时间.安全是当前编程语言和及时系统在复杂性与定义不清的接口上折中的办法,这些语法不能成为正式的保证系统安全的语法:性能受到威胁是因为工程师必须接受及时系统所提供的无论什么级别的操作,如果那些操作过高或过低都会导致非必要的日常

网络编程进阶:并发编程之协程、IO模型

协程: 基于单线程实现并发,即只用一个主线程(此时可利用的CPU只有一个)情况下实现并发: 并发的本质:切换+保存状态 CPU正在运行一个任务,会在两种情况下切走去执行其他任务(切换有操作系统强制控制),一种情况是该任务发生了阻塞,另一种是该任务计算的时间过长或有一个优先级更高的程序替代了它 在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 如果多个任务都是纯计算的,上图的情况2并不能提升效率,因为只是让CPU来回切,这样看起来所有任务都被"同时

Java并发编程(四)Java内存模型

相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 前言 此前我们讲到了线程.同步以及volatile关键字,对于Java的并发编程我们有必要了解下Java的内存模型,因为Java线程之间的通信对于工程师来言是完全透明的,内存可见性问题很容易使工程师们觉得困惑,这篇文章我们来主要的讲下Java内存模型的相关概念. 1.共享内存和消息传递 线程之间的通信机制有两种:共享内存和消息传递:在共享内存的并发模型里,线程之间共享程序的

【并发编程】JMM:java内存模型抽象

本文试图向大家解释清楚JMM及其抽象模型,但不仅仅是一个介绍,更希望能讲清楚JMM内存模型抽象的原因. 一.JMM的概念: 二.JMM的抽象将内存内存模型分成线程私有的本地内存和所有线程共享的主存: 三.JMM抽象模型造成了并发编程中共享变量的内存可见性问题,为什么会造成?选择这样的抽象模型有什么好处?有什么样的方法来处理这个问题? 一.JMM JMM直译过来就是java内存模型(java memory model),他的更深层次的描述,"JMM是一个语言级的内存模型,通过屏蔽各个系统平台的差异

高并发编程之线程安全与内存模型

微信公众号:Java修炼指南关注可与各位开发者共同探讨学习经验,以及进阶经验.如果有什么问题或建议,请在公众号留言.博客:https://home.cnblogs.com/u/wuyx/ 前几期简单介绍了一些线程方面的基础知识,以及一些线程的一些基础用法(想看往期文章的小伙伴可以直接拉到文章最下方飞速前往).本文通过java内存模型来介绍线程之间不可见的原因. 本期精彩原子性有序性指令重排序可见性Happen-Before规则 原子性 原子性对于我们开发者来说应该算是比较熟悉的了,通俗点说就是执

[书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型

本文是我翻译<JavaScript Concurrency>书籍的第二章 JavaScript运行模型,该书主要以Promises.Generator.Web workers等技术来讲解JavaScript并发编程方面的实践. 完整书籍翻译地址:https://github.com/yzsunlei/javascript_concurrency_translation .由于能力有限,肯定存在翻译不清楚甚至翻译错误的地方,欢迎朋友们提issue指出,感谢. 本书第一章我们探讨了JavaScri

Linuxx环境下,使用PHP创建一个守护进程

<?php $pid = pcntl_fork(); // fork if ($pid < 0) exit; else if ($pid) // parent exit; else { // child $sid = posix_setsid(); if ($sid < 0) exit; for($i = 0; $i <= 60; $i++) { // do something for 5 minutes sleep(5); } } ?> 这是php官方手册给出的方法,不过在

三.线程优先级和守护进程

1.线程的优先级 在操作系统中,线程可以划分优先级,优先级高的线程得到的CPU资源较多,也是CPU优先执行优先级较高的线程对象中的任务. 设置线程优先级有助于帮“线程规划器”确定在下一次选择哪一个线程来优先执行. 设置优先级使用setPriority()方法. 线程优先级的继承性 java中线程的优先级具有继承性,比如A启动B,则B的优先级和A相同. 优先级具有规则性 虽然使用setPriority()方法可以设置线程的优先级,但还没有看到设置优先级所带来的效果 线程2: 高优先级的线程总是大部