并发编程-多进程
发布时间:2021-01-08 04:47:22  所属栏目:系统  来源:网络整理 
            导读:副标题#e# 一.进程 新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的。 1.在UNIX中:fork会创建一个与父进程一摸一样的副本 2.在Windows:系统调用CreateProcess创建进程 进程的状态 程序遇到IO操作(Input、output),会阻塞
                
                
                
            | 互斥锁vs 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.效率低(共享数据基于文件,而文件是硬盘上的数据) (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 



