zoukankan      html  css  js  c++  java
  • Python3 多线程

    简单实现多线程

    import threading
    import time
    
    def sing(sing):
        for i in range(5):
            print("---sing()---{}".format(sing))
            time.sleep(1)
    
    def dance(dance):
        for i in range(5):
            print("---dance()---{}".format(dance))
            time.sleep(1)
    
    def main():
        t1 = threading.Thread(target=sing,args=("t1",))
        t2 = threading.Thread(target=dance,args=("t2",))
        t1.start()
        t2.start()
    
    if __name__ == "__main__":
        main()

    多线程互斥锁

    import threading
    import time
    
    A = 2
    lock = threading.Lock()
    #创建一个互斥锁
    
    def sing(sing):
        global A
        for i in range(500000):
            lock.acquire()
            #加锁
            A += 1
            lock.release()
            #解锁
            print('{}:{}'.format(sing,i))
    
    def dance(dance):
        global A
        for i in range(500000):
            lock.acquire()
            #加锁
            A -= 1
            lock.release()
            #解锁
            print('{}:{}'.format(dance,i))
    
    def main():
        global A
        t1 = threading.Thread(target=sing,args=("t1",))
        t2 = threading.Thread(target=dance,args=("t2",))
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        print(A)
    
    if __name__ == "__main__":
        main()

    查看线程数量

    使用

    threading.enumerate()

    获取当前所有线程。

    此处打印出一个列表,列表中共有3个线程信息。一个是主线程,另外两个是子线程

    这里需要注意,我们需要在代码中使用join()方法来阻塞主线程。当所有阻塞的子线程执行完毕后,才会继续执行主线程。

    通过继承Thread类,重写run方法实现多线程

    import threading
    import time
    
    A = 2
    lock = threading.Lock()
    #创建一个互斥锁
    
    class my_thread(threading.Thread):
        def run(self) -> None:
            self.sing()
    
        def sing(self):
            global A
            if self._kwargs['mothed'] == 'add':
                tmp = 1
            elif self._kwargs['mothed'] == 'del':
                tmp = -1
            else:
                tmp = 1
            for i in range(50):
                lock.acquire()
                #加锁
                A += tmp
                lock.release()
                #解锁
                print('{}:{}:{}'.format(self._kwargs['cs'],i,A))
    
    def main():
        global A
        t1 = my_thread(kwargs={'cs':'sing','mothed':'add'},name="T1")
        t2 = my_thread(kwargs={'cs':'dance','mothed':'del'},name="T2")
        t1.start()
        t2.start()
        print(threading.enumerate())
        print(A)
        t1.join()
        t2.join()
        print(A)
    
    if __name__ == "__main__":
        main()

    多线程UDP聊天器

    import threading
    import socket
    
    class my_thread(threading.Thread):
        def run(self) -> None:
            if self._kwargs['mothed'] == 'recv_message':
                self.recv_message()
            elif self._kwargs['mothed'] == 'send_message':
                self.send_message()
    
        def send_message(self):
            while True:
                try:
                    ip = input("目标IP:")
                    port = int(input("目标端口:"))
                    msg = input("发送的消息:").encode('utf-8')
                except:
                    continue
                self._kwargs['udp_socket'].sendto(msg,(ip,port))
    
        def recv_message(self):
            while True:
                    data,client_addr = self._kwargs['udp_socket'].recvfrom(1024)
                    print('source:', client_addr,'收到的数据:', data.decode("UTF-8"))
    
    def main():
        udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        udp_socket.bind(("",20216))
        recv_message = my_thread(kwargs={'udp_socket':udp_socket,'mothed':'recv_message'},name="recv_message")
        send_message = my_thread(kwargs={'udp_socket':udp_socket,'mothed':'send_message'},name="send_message")
        recv_message.start()
        send_message.start()
        recv_message.join()
        send_message.join()
    
    if __name__ == "__main__":
        main()
  • 相关阅读:
    Android 编译笔记20191205
    react 编写 基于ant.design 页面的参考笔记
    Codeigniter项目使用phpDocumentor生成api文档
    php curl Problem with the SSL CA cert (path access rights)
    我的浏览器标签同步方案:坚果云+Floccus
    vue Inline JavaScript is not enabled. Is it set in your options?
    学习应该保留的十件事情
    ngx-moment汉化
    Quill Editor使用公式
    mac os安装多个版本的chrome
  • 原文地址:https://www.cnblogs.com/xlcm/p/14849592.html
Copyright © 2011-2022 走看看