首页 > 系统相关 >并发编程 2 进程

并发编程 2 进程

时间:2022-11-20 18:35:54浏览次数:49  
标签:__ name start 编程 print 并发 time 进程

同步与异步

# 用来表达任务的提交方式
同步 : 提交完任务之后原地等待任务的返回结果,期间不做任何事
异步 : 提交完任务之后不愿地等待任务的返回结果,直接去做其他事,有结果自动通知.
异步非阻塞 (效率最高

创建进程的多种方式

# 1.鼠标双击软件图标
# 2.python代码创建进程
"""
在不同的操作系统中创建进程底层原理不一样
    windows  : 以导入模块的形式创建进程
    linux/mac :以拷贝代码的形式创建进程
"""


 from multiprocessing import Process
 import time


 def task(name):
     print('task is running',name)
     time.sleep(3)
     print('task is over',name)

 if __name__ == '__main__':
     # p1 = Process(target=task, args=('jason',))  # 位置参数
     p1 = Process(target=task, kwargs={'name':'jason123'})  # 关键字参数
     p1.start()  # 异步 告诉操作系统创建一个新的进程 并在该进程中执行task函数
     # task()    # 同步
     print('主')

 进程间的数据隔离

"""各进程之间开启后的数据只能在该进程内生效,无法生效到其他进程"""

from multiprocessing import Process import time money = 1000 def task(): global money money = 666 print('子进程的task函数查看money',money) if __name__ == '__main__': p1 = Process(target=task) p1.start() # 创建子进程 time.sleep(3) # 主进程代码等待3s print(money) # 主进程代码打印money

结果:

 

 进程的join方法

from multiprocessing import Process
import time

def task(name,n):
    print('%s is running' % name)
    time.sleep(n)
    print('%s is over' % name)

if __name__ == '__main__':
    p1 = Process(target=task, args=('jason1', 1))
    p2 = Process(target=task, args=('jason2', 2))
    p3 = Process(target=task, args=('jason3', 3))
    # 主进程代码会在子进程代码运行结束后再去执行
    start_time = time.time()
    p1.start()
    p1.join()  # join使用的位置不同,代码的执行就不同
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    print(time.time() - start_time)   # 结果是6s多,原因是每次执行昂完当前任务才会执行下一个

   # 所有进程同时进行
    start_time = time.time()
    p1.start()
    p2.start()
    p3.start()
    p1.join()  # join使用的位置不同,代码的执行就不同
    p2.join()
    p3.join()
    print(time.time() - start_time)  # 结果是3s多,开启所有进程运行,最后完成的进程就是全部花费的时间

IPC机制

IPC机制:   指的是进程间的通信机制
消息队列:   存储数据的地方,所有人都可以进行数据的存取

from multiprocessing import Queue
""""队列:先进先出"""
q = Queue(3)    # 括号内指定的是存储数据的个数
q.put(111)      # 队列中存入数据
print(q.full()) # 判断队列是否已经满了
q.put(222)
q.put(333)
print(q.full())
print(q.get())  # 从队列中取出数据
print(q.empty())# 判断队列是否为空
print(q.get())
print(q.get())
print(q.get_nowait())  # 自定义异常,使其变为阻塞
"""full()和empty()在多进程中都不能使用"""

from multiprocessing import Process,Queue

def product(q):
    q.put('子进程p添加的数据')

def consumer(q):
    print('子进程获取队列中的数据',q.get())

if __name__ == '__main__':
    q = Queue()
    # 主进程往队列中添加数据
    p1 = Process(target=consumer,args=(q,))
    p2 = Process(target=product,args=(q,))
    p1.start()
    p2.start()
    print('主进程')

生产者消费者模型

生产者: 负责产生数据的'人'
消费者: 负责处理数据的'人'
    该模型除了有生产者和消费者之外还必须有消息队列(只要是能够提供数据保存服务和提取服务的理论上都可以)

进程对象的多种方法

# 1.如何查看进程号    
from multiprocessing import Process, current_process    current_process()    
current_process().pid     
import os    
os.getpid()    
os.getppid()

# 2.终止进程    
p1.terminate()    ps:计算机操作系统都有对应的命令可以直接杀死进程

# 3.判断进程是否存活    
p1.is_alive()

# 4.start()

# 5.join()

守护进程

# 守护进程会随着守护的进程结束而立刻结束
 from multiprocessing import Process
 import time

 def task(name):
     print('守卫:%s存活' % name)
     time.sleep(3)
     print('守卫:%s被刀' % name)

 if __name__ == '__main__':
     p = Process(target=task, args=('1',))
     p.daemon = True  
         # 此代码将子进程设置为守护进程:主进程代码结束,子进程立刻结束。且必须在start之前执行
     p.start()
     print('预言家被刀出局!!!')

孤儿进程与僵尸进程

僵尸进程: 进程已经运行结束 但是相关的资源并没有完全清空
      需要父进程参与回收
孤儿进程: 父进程意外死亡 子进程正常运行 该子进程就称之为孤儿进程
      孤儿进程也不是没有人管 操作系统会自动分配资源接收

多进程数据错乱问题

# 1. 多进程操作数据很可能会造成数据错乱>>>:互斥锁
# 2. 互斥锁:将并发变成串行,牺牲了效率但是保障了数据的安全


"""模拟12306"""
from multiprocessing import Process
import time
import json
import random

# 查票
def search(name):
    with open(r'data.json', 'r', encoding='utf8') as f:
        data = json.load(f)
    print('%s在查票 当前余票为:%s' % (name, data.get('ticket_num')))

# 买票
def buy(name):
    # 再次确认票
    with open(r'data.json', 'r', encoding='utf8') as f:
        data = json.load(f)
    # 模拟网络延迟
    time.sleep(random.randint(1, 3))
    # 判断是否有票 有就买
    if data.get('ticket_num') > 0:
        data['ticket_num'] -= 1
        with open(r'data.json', 'w', encoding='utf8') as f:
            json.dump(data, f)
        print('%s买票成功' % name)
    else:
        print('%s很倒霉 没有抢到票' % name)


def run(name):
    search(name)
    buy(name)


if __name__ == '__main__':
    for i in range(10):
        p = Process(target=run, args=('用户%s' % i,))
        p.start()

 

标签:__,name,start,编程,print,并发,time,进程
From: https://www.cnblogs.com/juzijunjun/p/16904716.html

相关文章

  • 多进程
    进程和程序进程:正在执行的程序程序:还没有执行的代码,处于静态一、进程的状态使用进程实现多任务multiprocessing模块就是跨平台的多进程模块提供了有个Process......
  • python进程
    今日内容概要同步与异步阻塞与非阻塞创建进程的多种方式进程join方法进程间数据隔离进程间通信之IPC机制进程对象诸多方法生产者消费者模型互斥锁今日内容......
  • 《Unix/Linuv系统编程》第十四章学习笔记
    第14章MYSQL数据库系统MYSQL简介1.MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB......
  • mongodb后台守护进程启动
    Mongodb可以通过命令行方式和配置文件的方式来启动,具体命令如下:命令行: Shell代码1.[root@localhostmongodb]#./bin/mongod--dbpath=/data/db配置文件:Shell代码1.[......
  • 配置云服务器(Ubuntu)的vnc守护进程(服务)
    tags:UbuntuServer写在前面之前配置过了基于Ubuntu的阿里云服务器,并且通过vnc远程查看UI界面,但是美中不足的一点就是每次开启ssh会话都要重新输入​​vncserver-kill......
  • linux进程回收
    1为什么要进行进程资源的回收当一个进程退出之后,进程能够回收自己的用户区的资源,但是不能回收内核空间的PCB资源,必须由它的父进程调用wait或者waitpid函数完成对子进程的回......
  • 网络并发总结
    周总结计算机网络编程理论针对软件开发目前市面上的主流软件都基本上会使用网络进行通信传输各种数据作为软件开发人员掌握网络编程理论和了解网络编程开发架构是......
  • 《Unix/Linux系统编程》第十二周学习笔记
    《Unix/Linux系统编程》第十二周学习笔记MySQL数据库简介MySQL是一个关系型数据库管理系统,是最流行的关系型数据库管理系统之一。在WEB应用方面,MySQL是最好的RDBMS......
  • java——多线程——进程的理解
    进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程......
  • java——多线程——并发与并行的了解以及区别
                     多线程的概念想要设计一个程序,边打游戏边听歌,怎么设计?得使用多进程或者多线程来解决.并发与并行并发:指两......