• 进程


    # 进程 与 进程之间的数据是隔离的,比如例子两个变量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('33[32m%s买到票了33[0m'%i)
    else:
    print('33[31m%s没买到票33[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() # 还钥匙








  • 相关阅读:
    python学习(20) 网络编程
    MySQL与mongodb数据库备份与恢复
    Java(一)——Ubuntu18.04下Java环境配置
    安全服务——CVE中CVSS相关指标介绍
    爬虫(十一)—— 请求库(三)pypeteer请求库
    爬虫(十)—— scrapy框架
    抓包工具Fiddler
    爬虫(九)—— 爬虫高性能
    爬虫(八)—— 存储库(三)MySQL存储库
    爬虫(七)—— 存储库(二)Redis存储库
  • 原文地址:https://www.cnblogs.com/mys6/p/10840747.html
Copyright © 2020-2023  润新知