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()
原文地址:https://www.cnblogs.com/xlcm/p/14849592.html