zoukankan      html  css  js  c++  java
  • python_进程与线程的补充

    进程与线程的标识

    知识点一:进程id 与 线程ident

    import time
    import multiprocessing
    import threading
    time.sleep(10)
    print(multiprocessing.current_process().pid)  # 进程
    
    def func():
        time.sleep(5)
    
    p = threading.Thread(target=func)
    p.start()
    print(p.ident)  # 线程

    xshell

    ps aux | grep python3

    知识点二:进程名 与 线程名

    import time
    import multiprocessing
    import threading
    
    def func():
        time.sleep(1)
    
    p = threading.Thread(target=func, name='李木子')
    p.start()
    print(p)
    print(p.name)
    
    print('- - ' *20)
    p.name = '李希'
    print(p)

    知识点三:获取当前线程/进程信息

    提示!
    可以在任何一个进程或者线程里搞清楚自己是谁

    import time
    import multiprocessing
    print(multiprocessing.current_process())   # 获取主进程中的当前进程对象
    
    
    def fun():
        print("- - "*10)
        print(multiprocessing.current_process()) # 获取子进程中的当前进程对象
    
    
    p = multiprocessing.Process(target=fun, name='李希一号')
    print(p)
    p.start()

    进程与线程的其余相关操作

    知识点一:等待结束

    等待进程或线程结束

    提示!进程和线程是一样的同学们课后自己尝试

    import time
    import multiprocessing
    
    print("外层start", time.asctime())
    
    def func():
        print("里层start", time.asctime())
        time.sleep(5)
        print("里层end", time.asctime())
    p = multiprocessing.Process(target=func)
    p.start()
    time.sleep(5)
    print("外层end", time.asctime())

    可以看到,并行结果,主子同时进行

    加上join,等待子进程结束,再执行主进程

    import time
    import multiprocessing
    
    print("外层start", time.asctime())
    
    def func():
        print("里层start", time.asctime())
        time.sleep(5)
        print("里层end", time.asctime())
    p = multiprocessing.Process(target=func)
    p.start()
    
    p.join()  # 主进程 等待子进程结束
    
    time.sleep(5)
    print("外层end", time.asctime())

    中止进程

    注意!线程并不能被中途中止只能等待其运行结束

    import time
    import multiprocessing
    print(multiprocessing.current_process())
    
    
    def fun():
        print("里层start", time.asctime())
        time.sleep(5)
        print("里层end", time.asctime())
    
    p = multiprocessing.Process(target=fun, name='李希一号')
    p.start()
    time.sleep(2)
    p.terminate()  # 不管你执行多久,同时结束主进行和子进程

    进程与线程的生存与状态

    import time
    import multiprocessing
    
    def func():
        time.sleep(5)
    
    p = multiprocessing.Process(target=func, name='李木子')
    print(p)
    print("状态:",p.is_alive())
    
    p.start()
    print(p)
    print("状态:",p.is_alive())

     守护模式

    提示!多线程中的守护线程与守护进程类似

    通俗的讲,皇帝死后(主进程),妃子陪葬(子进程)

    import time
    import multiprocessing
    
    def func():
        print('start')
        time.sleep(5)
        print('end')
    
    p = multiprocessing.Process(target=func, daemon=True)  # 设置守护进程
    p.start()
    time.sleep(2)

     以面向对象的形式使用进程与线程

    面向对象使用线程/进程
    步骤一: 继承 Process或Thread 类
    步骤二: 重写 __init__方法
    步骤三: 重写 run方法

    import time
    import multiprocessing
    
    class MyProcess(multiprocessing.Process):
    
        def __init__(self, *args, **kwargs):
            super().__init__()  # super重写
            self.args = args
            self.kwargs = kwargs
    
        def run(self):
            print('我是重写的')
            print(multiprocessing.current_process())    # 子进程的当前进程对象
            print(self.args)
            print(self.kwargs)
    
    print(multiprocessing.current_process())  # 主进程的当前进程对象
    p = MyProcess(1, 2, 3, a=1, b=2)  # 实例化
    p.start()

    面向对象使用的思路

    用面向对象的方式来实现多线程并发服务器
    import time
    import socket
    import threading
    
    server = socket.socket()
    server.bind(('0.0.0.0', 8888))
    server.listen()
    
    class MyThread(threading.Thread):
    
        def __init__(self, conn):
            super().__init__()  # super重写
            self.conn = conn
            print(self.conn)
    
        def run(self):
            while True:
                data = self.conn.recv(1024)
    
                if data == b'':
                    self.conn.close()
                    break
                else:
                    print("接收到的消息: {}".format(data.decode()))
                    self.conn.send(data)
    
    
    
    while True:
        conn, addr = server.accept()
        print("{}正在连接".format(addr))
    
        p = MyThread(conn)  # 实例化
        p.start()

    客户端:

    import socket
    
    click = socket.socket()
    click.connect(('127.0.0.1', 8888))
    
    while True:
         data = input("请输入你要发送的数据:")
         click.send(data.encode())
         print("接收到的消息: {}".format(click.recv(1024).decode()))

     总结完毕!

    作者:含笑半步颠√

    博客链接:https://www.cnblogs.com/lixy-88428977

    声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。

  • 相关阅读:
    VS2013+PTVS,python编码问题
    关于网易云音乐爬虫的api接口?
    Django分页和查询参数的问题
    angular route 与 django urls 冲突怎么解决?
    200 from memory cache / from disk cache / 304 Not Modified 区别
    go语言中在变量后加上接口是什么意思?
    append生成新变量的时候,没有如预期(It's a feature,not a bug?)
    为一个支持GPRS的硬件设备搭建一台高并发服务器用什么开发比较容易?
    学golang之前都需要哪些前置知识?
    求推荐go语言开发工具及go语言应该以哪种目录结构组织代码?
  • 原文地址:https://www.cnblogs.com/lixy-88428977/p/9656256.html
Copyright © 2011-2022 走看看