首页 > 其他分享 >多线程操作

多线程操作

时间:2024-05-29 12:33:49浏览次数:21  
标签:__ name Thread work 线程 操作 多线程 def

【一】threading模块开启线程的两种方式

【1】直接调用Thread

from threading import Thread
import time


def task(name):
    print(f'{name} is starting')
    time.sleep(3)
    print(f'{name} is ending')


def main():
    t = Thread(target=task, args=("drake",))
    # 创建线程的开销非常小,几乎代码运行的一瞬间线程就已经创建了
    t.start()


if __name__ == '__main__':
    main()
# drake is starting
# drake is ending

【2】继承Thread父类

from threading import Thread
import time


class MyThread(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(f'{self.name} is starting')
        time.sleep(3)
        print(f'{self.name} is ending')


def main():
    t1 = MyThread('dream')
    t2 = MyThread('uzi')
    t1.start()
    t2.start()


if __name__ == '__main__':
    main()

# dream is starting
# uzi is starting
# uzi is ending
# dream is ending

【三】一个进程下开启多个线程和多个子进程的区别

【1】谁的开启速度快

from threading import Thread
from multiprocessing import Process
import time


def work():
    print('hello')


def timer(func):
    def inner(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        print(f'函数 {func.__name__} 运行时间为:{time.time() - start_time}')
        return res

    return inner


@timer
def work_process():
    # 在主进程下开启子进程
    t = Process(target=work)
    t.start()


@timer
def work_thread():
    # 在主进程下开启线程
    t = Thread(target=work)
    t.start()


if __name__ == '__main__':
    work_thread()
    work_process()
# hello
# 函数 work_thread 运行时间为:0.0009613037109375
# 函数 work_process 运行时间为:0.03390765190124512
# hello

【2】查看pid

from threading import Thread
from multiprocessing import Process
import os


def work():
    print(f"该程序pid:{os.getpid()}")


def work_thread():
    # 在主进程下开启多个线程,每个线程都跟主进程的pid一样
    t1 = Thread(target=work)
    t2 = Thread(target=work)
    t1.start()
    t2.start()


def work_process():
    # 开多个进程,每个进程都有不同的pid
    p1 = Process(target=work)
    p2 = Process(target=work)
    p1.start()
    p2.start()


if __name__ == '__main__':
    work_thread()
    # 该程序pid:100620
    # 该程序pid:100620
    work_process()
    # 该程序pid:100772
    # 该程序pid:103280

【3】同一进程内的线程共享该进程的数据

from threading import Thread
from multiprocessing import Process


def work():
    global num
    num = 0


def work_process():
    num = 100
    p = Process(target=work)
    p.start()
    p.join()
    print(f'进程num:{num}')  # 子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100
    # 进程num:100


def work_thread():
    num = 1
    t = Thread(target=work)
    t.start()
    t.join()
    print(f'线程num:{num}')  # 查看结果为1,因为同一进程内的线程之间共享进程内的数据
    # 线程num:1


if __name__ == '__main__':
    # 多进程:子进程只改自己的
    work_process()
    # 多线程:数据发生错乱,同一进程内的线程之间共享数据
    work_thread()

【四】多线程并发的服务端

  • 服务端
from threading import Thread
from socket import *


# 不写参数:默认是TCP协议
# 创建服务器对象
server = socket()
# 绑定 IP PORT
IP = '127.0.0.2'
PORT = 8081
ADDR = (IP, PORT)
server.bind(ADDR)
# 监听
server.listen(5)


# 将接受处理数据部分封装成函数调用
def run(conn):
    while True:
        from_client = conn.recv(1024)
        # 接受的信息为空时,会无限循环
        if len(from_client) == 0:
            break
        # 接收到客户端的信息
        print(f"这是来自客户端的消息:{from_client.decode()}")
        # 返回给客户端信息
        to_client = '你的消息我已收到!'
        conn.send(to_client.encode())
    # 关闭链接
    conn.close()


def main():
    while True:
        # 接受连接对象和 ip port
        conn, addr = server.accept()
        t = Thread(target=run, args=(conn,))
        t.start()


if __name__ == '__main__':
    main()
  • 客户端
from socket import *

# 不写参数:默认是TCP协议
# 创建客户端对象
client = socket()

# 绑定 IP PORT
IP = '127.0.0.2'
PORT = 8081
ADDR = (IP, PORT)
client.connect(ADDR)

while True:
    # 向服务端发数据
    message = input("请输入发送给服务端的消息:").strip()
    client.send(message.encode())

    # 接受服务器返回的数据
    data_from_server = client.recv(1024)
    print(data_from_server.decode())

【五】线程对象的属性和方法

【1】线程对象的 join 方法

from threading import Thread
import time


def task(name):
    print(f'{name} is starting')
    time.sleep(3)
    print(f'{name} is ending')


def main():
    t1 = Thread(target=task, args=('drake',))
    t2 = Thread(target=task, args=('uzi',))
    t1.start()
    t2.start()
    # 主线程等待子进程结束之后再运行
    t1.join()
    t2.join()


if __name__ == '__main__':
    main()
    # drake is starting
    # uzi is starting
    # drake is ending
    # uzi is ending

【2】获取当前进程的名字——current_thread

from threading import Thread, active_count, current_thread
import time


def task():
    # 获取当前线程的名字
    print(f'该线程的名字:{current_thread().name}')
    time.sleep(2)


def main():
    t1 = Thread(target=task)
    t2 = Thread(target=task)
    t1.start()
    t2.start()
    print(f'该线程的名字:{current_thread().name}')


if __name__ == '__main__':
    main()
    # 该线程的名字:Thread - 1(task)
    # 该线程的名字:Thread - 2(task)
    # 该线程的名字:MainThread

【3】统计当前活跃的线程数——active_count

from threading import Thread, active_count, current_thread
import time


def task():
    # 获取当前线程的名字
    print(f'该线程的名字:{current_thread().name}')
    time.sleep(2)


def main():
    t1 = Thread(target=task)
    t2 = Thread(target=task)
    t1.start()
    t2.start()
    # 统计当前活跃的线程数
    print(f'当前活跃的线程数:{active_count()}')
    print(f'该线程的名字:{current_thread().name}')


if __name__ == '__main__':
    main()
    # 该线程的名字:Thread - 1(task)
    # 该线程的名字:Thread - 2(task)
    # 当前活跃的线程数:3
    # 该线程的名字:MainThread

标签:__,name,Thread,work,线程,操作,多线程,def
From: https://www.cnblogs.com/ligo6/p/18218353

相关文章

  • 多线程理论
    【一】什么是线程【1】介绍每个进程有一个地址空间,而且默认就有一个控制线程线程就是一条流水线工作的过程所以进程只是用来把资源集中到一起,而线程才是cpu上的执行单位多线程的概念是在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内......
  • 解决使用XDocument操作FlowDocument时XML被格式化的问题
    最近需要对WPF中的FlowDocument进行解析编辑操作,理想的办法是解析成FlowDocument对象,但是有些操作不是很方便。 FlowDocument实际上还是XML,我直接使用XDocument去进行解析操作更方便。如下就是一个FlowDocument的一个段落1<Sectionxmlns="http://schemas.microsoft.com/wi......
  • 《JAVA基础》stream流操作--从0开始上操作!!
    小蒋:        在java开发的不同场景下,会出现很多种可能性。所以掌握多种编程的方法可以让开发更多可能。Java中的Stream流操作是Java8及更高版本中引入的一种高级数据处理机制,它提供了一种声明式的编程模型,用于处理集合、数组或其他数据源中的数据序列。StreamAPI使......
  • ElasticSearch之Doc结构中常规操作(新增字段、查询数据)
    背景:腾讯云上的ElasticSearch服务,操作客户端:Kibana1.在ES中指定doc_field_name内部新增字段的指令:PUTes_index_name/_mapping/${doc_field_name}{"properties":{"newFieldName":{"type":"integer"}}}备注:其中”es_index_nam......
  • LDRA Testbed(TBrun)软件单元测试_操作指南
    系列文章目录LDRATestbed软件静态分析_操作指南LDRATestbed软件静态分析_自动提取静态分析数据生成文档LDRATestbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建LDRATestbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果LDRATes......
  • workbench导入导出操作
    前言现如今大家基本上都是使用客户端操作数据库,包括数据库迁移,下面来详解一下如何使用MySqlWorkbench来做数据库导出和导入操作,很简单,但是有图解!正文操作入口数据库导出点击左侧的[DataExport]之后,呈现上面的图,按照说明选择自己的方式,然后点击[StartExport]就开始导出......
  • Pycharm + Git 操作合集
    一、首先需要下载Git这里就不展示如何下载啦~~~二、在Pycharm中配置Git三、本地项目上传到远程仓库或从远程仓库Clone项目到Pycharm情况一:仓库有项目,放到Pycharm中1.拉取仓库使用Git来进行clone操作克隆远程仓库:打开VCS->Git->Clone,如......
  • 考研复试问答-操作系统&数据结构
    操作系统中断的分类中断使CPU从用户态变为内核态,让操作系统内核强行收回CPU的控制权。中断分为内中断和外中断,内中断主要包括异常,比如自陷指令、地址越界、计算溢出;外中断主要是包括来自时钟以及I/O的中断;分时操作系统:时间片轮转,强调交互性实时操作系统:强调可靠性,分为硬实时......
  • MongoDB CRUD操作:投影Project详解
    MongoDBCRUD操作:投影Project详解文章目录MongoDBCRUD操作:投影Project详解返回文档的全部字段返回指定的字段和_id字段不输出_id字段指定排除的字段返回内嵌文档中的指定字段禁止内嵌文档中的特定字段数组中内嵌文档的投影聚合表达式的投影字段默认情况下,MongoDB查......
  • 4 SAP前台操作手册-MM模块-采购管理-采购申请创建、修改、显示-ME51N ME52N ME53N
    0总体说明SAP实施项目中,到了第3个阶段-系统实现,在这个阶段,因为蓝图汇报已经结束,配置也差不多完成了,自开发还在进行中,SAP标准功能下,可以进行基础业务的前台操作了,在实现阶段的尾端,客户指定的关键用户(俗称KU-KeyUser)会进行前台业务操作和练习,提高熟练程度,同时需要在外部SAP顾......