进程 - 多进程之间的数据隔离问题、使用多进程实现socket服务端的并发效果、守护进程、锁(三)

穿精又带淫゛_ 提交于 2019-12-26 14:09:41
# 进程 与 进程之间的数据是隔离的,比如例子两个变量n
import osfrom multiprocessing import Processdef func():    global n   # 声明了一个全局变量    n = 0       # 重新定义了一个n    print('pid : %s'%os.getpid(),n)if __name__ == '__main__':    n = 100    p = Process(target=func)    p.start()    p.join()    print(os.getpid(),n)# 使用多进程实现socket服务端的并发效果client端
import socketsk = socket.socket()sk.connect(('127.0.0.1',8080))msg = sk.recv(1024).decode('utf-8')print(msg)msg2 = input('>>>').encode('utf-8')sk.send(msg2)sk.close()server端
import socketfrom multiprocessing import Processdef serve(conn):    ret = '你好'.encode('utf-8')    conn.send(ret)    msg = conn.recv(1024).decode('utf-8')    print(msg)    conn.close()if __name__ == '__main__' :    sk = socket.socket()    sk.bind(('127.0.0.1',8080))    sk.listen()    try:        while True:            conn,addr = sk.accept()            p = Process(target=serve,args=(conn,))            p.start()    finally:        sk.close()# 守护进程
# 子进程 -- > 守护进程import timefrom multiprocessing import Processdef func():    while True:        time.sleep(0.2)        print('我还活着')def func2():    print('in func2 start')    time.sleep(8)    print('in func2 finished')if __name__ == '__main__':    p = Process(target=func)    p.daemon = True   # 设置子进程为守护进程    p.start()    p2 = Process(target=func2)    p2.start()    p2.terminate()     # 结束一个子进程    time.sleep(1)    print(p2.is_alive())  # 检验一个进程是否还活着    print(p2.name)    # i = 0    # while i<5:    #     print('我是socket server')    #     time.sleep(1)    #     i+=1# 守护进程 会 随着 主进程的代码执行完毕 而 结束# 在主进程内结束一个子进程 p.terminate()    #  结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程# 检验一个进程是否活着的状态 p.is_alive()# p.name p.pid 这个进程的名字和进程号

  #  锁

 

# 锁# 火车票ticket文件内容  {"ticket": 1}import jsonimport timefrom multiprocessing import Processfrom multiprocessing import Lock# def show(i):#     with open('ticket') as f:#         dic = json.load(f)#     print('余票: %s'%dic['ticket'])def buy_ticket(i,lock):    lock.acquire() #拿钥匙进门    with open('ticket') as f:        dic = json.load(f)        time.sleep(0.1)    if dic['ticket'] > 0 :        dic['ticket'] -= 1        print('\033[32m%s买到票了\033[0m'%i)    else:        print('\033[31m%s没买到票\033[0m'%i)    time.sleep(0.1)    with open('ticket','w') as f:        json.dump(dic,f)    lock.release()      # 还钥匙if __name__ == '__main__':    # for i in range(10):    #     p = Process(target=show,args=(i,))    #     p.start()    lock = Lock()    for i in range(10):        p = Process(target=buy_ticket, args=(i,lock))        p.start()未加锁前(出现一张票七个人买到)加锁后# 多进程的一段报错代码
from multiprocessing import Processdef func():    num = input('>>>')    print(num)  if __name__ == '__main__':    Process(target=func).start()
  这段代码执行后会报错,因为开启一个子进程func后给操作系统发送指令,操作系统在另外一片内存区域执行子进程,当前pycharm屏幕不会显示input请输入  所以子经常不能有input,平时我们server很少有input情况,一般是client和client经过server(消息转发)来实现沟通
多进程总结
# 多进程代码# from multiprocessing import Process# 方法    # 进程对象.start()     开启一个子进程    # 进程对象.join()      感知一个子进程的结束    # 进程对象.terminate() 结束一个子进程    # 进程对象.is_alive()  查看某个子进程是否还在运行# 属性    # 进程对象.name        进程名    # 进程对象.pid         进程号    # 进程对象.daemon      值为True的时候,表示新的子进程是一个守护进程            # 守护进程 随着主进程代码的执行结束而结束            # 一定在start之前设置# from multiprocessing import Lock# l = Lock()# l.acquire()   # 拿钥匙# 会造成数据不安全的操作# l.release()   # 还钥匙














 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!