设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 服务器 > 系统 > 正文

并发编程-多进程(3)

发布时间:2021-01-07 09:21 所属栏目:52 来源:网络整理
导读:互斥锁vs join的区别一: 大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序 区别:join是按照人为指定的顺序执行,而互斥锁是所以进程平等地竞争,谁先抢到谁执行 # 三个同事 同时用一个打印机打印内

互斥锁vs join的区别一:
大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序
区别:join是按照人为指定的顺序执行,而互斥锁是所以进程平等地竞争,谁先抢到谁执行

# 三个同事 同时用一个打印机打印内容.
# 三个进程模拟三个同事,输出平台模拟打印机.
# 
# 版本一:
from multiprocessing import Process
import time
import random
import os

def task1():
    print(f‘{os.getpid()}开始打印了‘)
    time.sleep(random.randint(1,3))
    print(f‘{os.getpid()}打印结束了‘)

def task2():
    print(f‘{os.getpid()}开始打印了‘)
    time.sleep(random.randint(1,3))
    print(f‘{os.getpid()}打印结束了‘)

def task3():
    print(f‘{os.getpid()}开始打印了‘)
    time.sleep(random.randint(1,3))
    print(f‘{os.getpid()}打印结束了‘)

if __name__ == ‘__main__‘:

    p1 = Process(target=task1)
    p2 = Process(target=task2)
    p3 = Process(target=task3)

    p1.start()
    p2.start()
    p3.start()
不加锁,效率高,但是容易出错
from multiprocessing import Process
import time
import random
import os

def task1(p):
    print(f‘{p}开始打印了‘)
    time.sleep(random.randint(1,3))
    print(f‘{p}打印结束了‘)

def task2(p):
    print(f‘{p}开始打印了‘)
    time.sleep(random.randint(1,3))
    print(f‘{p}打印结束了‘)

def task3(p):
    print(f‘{p}开始打印了‘)
    time.sleep(random.randint(1,3))
    print(f‘{p}打印结束了‘)

if __name__ == ‘__main__‘:

    p1 = Process(target=task1,args=(‘p1‘,args=(‘p2‘,args=(‘p3‘,))

    p2.start()
    p2.join()
    p1.start()
    p1.join()
    p3.start()
    p3.join()
使用join,保证了执行顺序,但是顺序是人为,有失公平
from multiprocessing import Process
from multiprocessing import Lock
import time
import random
import os

def task1(p,lock):
    ‘‘‘
    一把锁不能连续锁两次
    lock.acquire()
    lock.acquire()
    lock.release()
    lock.release()
    ‘‘‘
    lock.acquire()
    print(f‘{p}开始打印了‘)
    time.sleep(random.randint(1,3))
    print(f‘{p}打印结束了‘)
    lock.release()

def task2(p,lock):
    lock.acquire()
    print(f‘{p}开始打印了‘)
    time.sleep(random.randint(1,3))
    print(f‘{p}打印结束了‘)
    lock.release()

def task3(p,3))
    print(f‘{p}打印结束了‘)
    lock.release()

if __name__ == ‘__main__‘:

    mutex = Lock()
    p1 = Process(target=task1,mutex))
    p2 = Process(target=task2,mutex))
    p3 = Process(target=task3,mutex))

    p2.start()
    p1.start()
    p3.start()
使用lock锁,保证了执行顺序和公平性

四.进程间通信

我们知道,进程之间内存隔离,是不能共享内存中的数据的(例:py文件中的数据),但是可以共享磁盘上的文件。

1.基于文件通信

并发编程-多进程

?

这里利用抢票举例子:在多个进程修改一个数据资源时,要保证顺序,一定要串行。如在抢票过程中,查看票应该并发,抢票(写入文件)应该串行。

文件实现进程间通信缺点:

  1.效率低(共享数据基于文件,而文件是硬盘上的数据)

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读