首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day40(多线程) - 多线程、基于多线程(多客户端)的tcp通信

day40(多线程) - 多线程、基于多线程(多客户端)的tcp通信

原创
作者头像
少年包青菜
修改2020-12-16 16:16:24
7800
修改2020-12-16 16:16:24
举报
文章被收录于专栏:Python 学习Python 学习Python 学习

1.启动多线程

1.1 基于函数

import time
from threading import Thread, current_thread, get_ident, active_count


def action():
    """
    .current_thread(): 获取当前线程名
    .get_ident(): 获取当前线程 id
    """
    time.sleep(1)  # 休眠 1 秒,用于统计活跃线程数
    print(current_thread(), get_ident())


if __name__ == '__main__':
    for i in range(10):
        th = Thread(target=action)
        th.start()
    # 观察当前活跃的线程数
    print(active_count())

1.2 基于类

from threading import Thread, current_thread, active_count
import time


class MyThread(Thread):
    # obj.start() 实际上是用的 run() 方法
    # 但是对象不能直接调用 run() 方法
    # 直接调用就立即执行,成了单线程
    # start() 是抛出进程到后台,形成多个线程,
    # 每个独立的线程各自调用 run() 方法
    def run(self) -> None:
        time.sleep(1)
        # 当前进程
        print(current_thread())


if __name__ == '__main__':
    th_list = []
    for i in range(10):
        th_obj = MyThread()
        th_list.append(th_obj)
        th_obj.start()
    # 当前多少活跃进程
    print(active_count())

2.基于多线程的 socket

1.server.py

from threading import Thread
import socket
import time


def server(conn, addr):
    while 1:
        msg_from_client = conn.recv(1024).decode('utf8')
        if msg_from_client == 'q':
            print(addr, ':', msg_from_client)
            conn.send('bye'.encode('utf8'))
            conn.close()
            break
        print(addr, ':', msg_from_client)
        time.sleep(1)
        msg_to_client = str(addr) + ',你好啊'
        conn.send(msg_to_client.encode('utf8'))


if __name__ == '__main__':
    socket_obj = socket.socket()
    socket_obj.bind(('localhost', 8000))
    socket_obj.listen(1024)
    while 1:
        # 来一个请求接收一个
        # 没有请求就会阻塞在这里等待请求的到来
        connection, address = socket_obj.accept()
        th = Thread(target=server, args=(connection, address))
        th.start()

2.client1、client2、client3...

import socket

socket_obj = socket.socket()
# 连接请求
socket_obj.connect(('127.0.0.1', 8000))

"""服务端收发消息是 connection"""
"""客户端收发消息是 socket 对象"""
"""一收一发,夯住循环"""
while 1:
    msg_to_client = input('给服务端发消息>>>')
    socket_obj.send(msg_to_client.encode('utf8'))
    msg_from_server = socket_obj.recv(1024).decode('utf8')
    print('msg_from_server:', msg_from_server)
    if msg_from_server == 'bye':
        break
socket_obj.close()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.启动多线程
    • 1.1 基于函数
      • 1.2 基于类
      • 2.基于多线程的 socket
        • 1.server.py
          • 2.client1、client2、client3...
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档