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

# 进程 与 进程之间的数据是隔离的,比如例子两个变量n

import os
from multiprocessing import Process

def 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 socket

sk = 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 socket
from multiprocessing import Process
def 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 time
from multiprocessing import Process

def 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 json
import time
from multiprocessing import Process
from 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 Process
def 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() # 还钥匙








 

转载于:https://www.cnblogs.com/mys6/p/10840747.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值