美文网首页Python
多线程练习

多线程练习

作者: GHope | 来源:发表于2018-08-08 20:16 被阅读88次

一个进程结束的前提为进程内所有线程结束。
结束子线程-->让子线程中的任务结束(就是让run方法结束:结束循环多用添加类属性设置标志作为判断条件)
如果一个线程崩溃,不对其它线程造成影响。

写一个服务器,可以和多个客户端同时通信,并且把接收的消息显示在屏幕上

主程序

import socket
import pygame
from homework.color import Color
from homework.myThread import AcceptThread
from homework.myThread import ConversationThread


def creat_server():
    """创建服务器"""
    server = socket.socket()
    server.bind(('10.7.181.56', 8088))
    server.listen(520)

    # 在一个子线程中去监听
    server_thread = AcceptThread(server)
    server_thread.start()


if __name__ == '__main__':
    # 创建服务器
    creat_server()

    # 准备显示信息的屏幕
    pygame.init()
    screen = pygame.display.set_mode((600, 400))
    screen.fill(Color.white)
    pygame.display.flip()

    # 让屏幕一直存在
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()

        # 获取每条信息,显示在屏幕上
        screen.fill(Color.white)
        for message in ConversationThread.all_message[:]:
            if message.alive:
                # 显示信息
                font = pygame.font.SysFont('Time', 30)
                text = font.render(message.text, True, message.color)
                screen.blit(text, (message.x, message.y))

                # 滚动弹幕
                message.move()
            else:
                ConversationThread.all_message.remove(message)

        pygame.display.update()

    print('退出!!!')

线程类

from threading import Thread
import socket
from random import randint
from homework.color import Color


class Message:
    """文字信息类"""

    def __init__(self, text):
        self.text = text
        self.x = -50
        self.y = randint(20, 380)
        self.color = Color.rand_color()
        self.speed = randint(1, 5)
        self.alive = True

    def move(self):
        self.x += self.speed
        # 越界处理
        if self.x > 600 + 50:
            self.alive = False


class ConversationThread(Thread):
    """处理不同的客户消息"""
    all_message = []
    flag = True

    def __init__(self, conversation: socket.socket, address):
        super().__init__()
        self.conversation = conversation
        self.address = address

    def run(self):
        """服务器与客户端持续通话"""
        while ConversationThread.flag:
            try:
                re_message = self.conversation.recv(1024).decode(encoding='utf-8')
                # 接收到一个消息便创建一个消息对象
                message = Message(re_message)
                # print(re_message)
                # 保存所有的消息
                ConversationThread.all_message.append(message)

                self.conversation.send("".encode())
            except ConnectionResetError:
                print("%s已下线" % self.address)

        print('退出会话线程!')


class AcceptThread(Thread):
    """接收请求的线程类"""
    all_client = []  # 保存所有的用户端

    def __init__(self, server: socket.socket):
        super().__init__()
        self.server = server
        self.flag = True

    def run(self):
        while self.flag:
            conversation, address = self.server.accept()
            print('接收到%s的请求' % address)

            # 接收到一个客户端请求,便创建一个子线程实现会话功能
            t1 = ConversationThread(conversation, address)
            t1.start()
            AcceptThread.all_client.append(t1)

        # 关闭服务器之前,给所有的客户端发送消息
        for tt in AcceptThread.all_client:
            try:
                tt.conversation.send("服务器将关闭,请及时下线!!!".encode())
            except:
                pass
        print('退出请求线程!!')

颜色类

from random import randint


class Color:
    """颜色类"""
    white = 255, 255, 255

    @staticmethod
    def rand_color():
        return randint(0, 255), randint(0, 255), randint(0, 255)

客户端

import socket

if __name__ == '__main__':
    client = socket.socket()
    client.connect(('10.7.181.56', 8088))
    while True:
        # 发送消息
        message = input('>>>')
        client.send(message.encode())

        # 接收消息
        re_message = client.recv(1024).decode(encoding='utf-8')
        print(re_message)

相关文章

  • 多线程交替打印1~10的奇偶数

    题外话 今天终于周末了,没有出去运动,最近学了多线程,想练习下,找了到练习题,多线程交替打印1到100的奇偶数。 ...

  • ABC三个线程如何保证顺序执行

    介绍 最近看看多线程练习题,练习下多线程,这道题:ABC三个线程如何保证顺序执行。三个线程同时启动,然后按照顺序执...

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

  • 无标题文章

    ####把所有多线程练习一遍 * dispatch * NSOperation * pthread * NSThread

  • 多线程练习

    一个进程结束的前提为进程内所有线程结束。结束子线程-->让子线程中的任务结束(就是让run方法结束:结束循环多用添...

  • 多线程练习

    要求:(1)自定义容器,提供新增元素(add)和获取元素数量(size)的方法。(2)启动两个线程。线程1向容器中...

  • 多线程练习

  • java多线程学习小案例

    多线程的小练习 需求:实现一次修改一次输出 主要知识点:多线程,同步,等待和唤醒

  • 2020-07-02【多线程】

    进程 线程 多线程的实现方式1 设置/获取线程名称 线程调度 线程控制 线程生命周期 多线程实现方式2 练习 同步...

  • 多线程练习--死锁

    关于java的死锁可能网上一大堆的代码,作为初学者我觉得还是很有必要练习下,亲自实现,并分析其死锁的原理。 死锁的...

网友评论

    本文标题:多线程练习

    本文链接:https://www.haomeiwen.com/subject/svzxbftx.html