码迷,mamicode.com
首页 > 其他好文 > 详细

并发编程复习

时间:2018-02-16 17:23:10      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:代码   应该   search   lex   网络   并且   main   end   设置   

一、多进程

1.创建并开启子进程的两种方式

#开进程的方法一:
import time
import random
from multiprocessing import Process
def piao(name):
    print(%s piaoing %name)
    time.sleep(random.randrange(1,5))
    print(%s piao end %name)



p1=Process(target=piao,args=(egon,)) #必须加,号
p2=Process(target=piao,args=(alex,))
p3=Process(target=piao,args=(wupeqi,))
p4=Process(target=piao,args=(yuanhao,))

p1.start()
p2.start()
p3.start()
p4.start()
print(主线程)
#开进程的方法二:
import time
import random
from multiprocessing import Process


class Piao(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        print(%s piaoing %self.name)

        time.sleep(random.randrange(1,5))
        print(%s piao end %self.name)

p1=Piao(egon)
p2=Piao(alex)
p3=Piao(wupeiqi)
p4=Piao(yuanhao)

p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
print(主线程)

2.守护进程

主进程创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

  其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止

from multiprocessing import Process
import time
import random

class Piao(Process):
    def __init__(self,name):
        self.name=name
        super().__init__()
    def run(self):
        print(%s is piaoing %self.name)
        time.sleep(random.randrange(1,3))
        print(%s is piao end %self.name)


p=Piao(egon)
p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
print()
#主进程代码运行完毕,守护进程就会结束
from multiprocessing import Process
from threading import Thread
import time
def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar():
    print(456)
    time.sleep(3)
    print("end456")


p1=Process(target=foo)
p2=Process(target=bar)

p1.daemon=True
p1.start()
p2.start()
print("main-------") #打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止

 

3.进程间通信(队列)

from multiprocessing import Process,Queue
import time
def write(q):
    for i in range(1000000000):
        q.put(i)
        # time.sleep(1)
        print(q)


def read(q):
    while True:

            i=q.get()
            print(i,read)


if __name__ == __main__:
    q=Queue(10000)
    wp=Process(target=write,args=(q,))
    rp=Process(target=read,args=(q,))
    wp.start()

    rp.start()
    rp.join()

4.进程同步锁

#并发运行,效率高,但竞争同一打印终端,带来了打印错乱
from multiprocessing import Process
import os,time
def work():
    print(%s is running %os.getpid())
    time.sleep(2)
    print(%s is done %os.getpid())

if __name__ == __main__:
    for i in range(3):
        p=Process(target=work)
        p.start()
#由并发变成了串行,牺牲了运行效率,但避免了竞争
from multiprocessing import Process,Lock
import os,time
def work(lock):
    lock.acquire()
    print(%s is running %os.getpid())
    time.sleep(2)
    print(%s is done %os.getpid())
    lock.release()
if __name__ == __main__:
    lock=Lock()
    for i in range(3):
        p=Process(target=work,args=(lock,))
        p.start()
#文件db的内容为:{"count":1}
#注意一定要用双引号,不然json无法识别
from multiprocessing import Process,Lock
import time,json,random
def search():
    dic=json.load(open(db.txt))
    print(\033[43m剩余票数%s\033[0m %dic[count])

def get():
    dic=json.load(open(db.txt))
    time.sleep(0.1) #模拟读数据的网络延迟
    if dic[count] >0:
        dic[count]-=1
        time.sleep(0.2) #模拟写数据的网络延迟
        json.dump(dic,open(db.txt,w))
        print(\033[43m购票成功\033[0m)

def task(lock):
    search()
    get()
if __name__ == __main__:
    lock=Lock()
    for i in range(100): #模拟并发100个客户端抢票
        p=Process(target=task,args=(lock,))
        p.start()
#文件db的内容为:{"count":1}
#注意一定要用双引号,不然json无法识别
from multiprocessing import Process,Lock
import time,json,random
def search():
    dic=json.load(open(db.txt))
    print(\033[43m剩余票数%s\033[0m %dic[count])

def get():
    dic=json.load(open(db.txt))
    time.sleep(0.1) #模拟读数据的网络延迟
    if dic[count] >0:
        dic[count]-=1
        time.sleep(0.2) #模拟写数据的网络延迟
        json.dump(dic,open(db.txt,w))
        print(\033[43m购票成功\033[0m)

def task(lock):
    search()
    lock.acquire()
    get()
    lock.release()
if __name__ == __main__:
    lock=Lock()
    for i in range(100): #模拟并发100个客户端抢票
        p=Process(target=task,args=(lock,))
        p.start()

 

二、多线程

 

三、协程

并发编程复习

标签:代码   应该   search   lex   网络   并且   main   end   设置   

原文地址:https://www.cnblogs.com/ldq1996/p/8450290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!