什么是多任务和线程?用线程写的一个udp同步聊天器

简介: 什么是多任务和线程?用线程写的一个udp同步聊天器

简单地说,就是操作系统可以同时运行多个任务。实现多任务有多种方式,线程、进程、协程。

threading 穿线,穿过,编制

thread 线,思路

target 目标

args 参数

enumerate 列举,枚举

acquire 获得,取得,学到

release 释放, 发射,让与

mutex 互斥

a = (1) 不是一个元组

a = (1,) 是一个元组

args = ( ,)  传递参数的时候,一定要加上逗号

 

t.join( ) 保证线程运行完再运行后面的代码

谁先上锁,谁就先执行,谁后上锁,谁就后执行

 

 

并行和并发的区别?

并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)

并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的

真的多任务叫并行,假的多任务叫并发。

什么是线程?

可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,而每个进程的时间片相等,线程是操作系统调度执行的最小单位.

线程的创建步骤

Import threading

# 创建一个线程对象

t1 = threading.Thread(target=func_name, args=(num,), name=”子线程名字”)

# 创建一个线程并启动

t1.start()

# 等待子线程执行完毕之后再继续向下执行主线程

t1.join()

备注:主线程会等待子线程结束之后才会结束,主线程一死,子线程也会死。线程的调度是随机的,并没有先后顺序。

枚举函数enumerate的用法

enumerate()是python的内置函数,在字典上是枚举、列举的意思。用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。通过threading.enumerate()就可以获取线程列表。

thread_listt = threading.enumerate()

print(thread_listt)

 

互斥锁的运用

由于多线程之间共享全局变量就会导致出现资源竞争的问题,为了避免这种竞争出现,利用互斥锁可以实现线程同步。

# 创建锁
Mutex = threading.Lock()
# 加锁
Mutex.acquire()
# 释放锁
Mutex.release()

 

什么是死锁?(了解)

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁,尽管死锁很少发生,但一旦发生就会造成应用的停止响应。

 

使用线程构造一个同步聊天器:

# udp同步聊天器,使用线程
import threading
import socket
 
 
def recv(udp_socket):
# 循环接收信息
while True:
recv_data = udp_socket.recvfrom(1024)
print(recv_data)
 
 
def send(udp_socket, local_ip, local_port):
# 循环发送信息
while True:
send_data = input("请输入要发送的信息:")
udp_socket.sendto(send_data.encode("utf-8"), (local_ip, local_port))
 
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
# 绑定本地信息
local_ip = input("请输入对方ip:")
local_port = int(input("请输入端口:"))
local_add = ("", 8989)
udp_socket.bind(local_add)
 
# 创建线程,运行接收和发送函数
t1 = threading.Thread(target=recv, args=(udp_socket,))
t2 = threading.Thread(target=send, args=(udp_socket, local_ip, local_port))
t1.start()
t2.start()
 
 
if __name__ == '__main__':
main()
目录
相关文章
|
3天前
|
消息中间件 前端开发 Java
美团面试:如何实现线程任务编排?
线程任务编排指的是对多个线程任务按照一定的逻辑顺序或条件进行组织和安排,以实现协同工作、顺序执行或并行执行的一种机制。 ## 1.线程任务编排 VS 线程通讯 有同学可能会想:那线程的任务编排是不是问的就是线程间通讯啊? 线程间通讯我知道了,它的实现方式总共有以下几种方式: 1. Object 类下的 wait()、notify() 和 notifyAll() 方法; 2. Condition 类下的 await()、signal() 和 signalAll() 方法; 3. LockSupport 类下的 park() 和 unpark() 方法。 但是,**线程通讯和线程的任务编排是
|
4天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
4天前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
90 0
|
2天前
|
Java 测试技术 Python
Python的多线程允许在同一进程中并发执行任务
【5月更文挑战第17天】Python的多线程允许在同一进程中并发执行任务。示例1展示了创建5个线程打印"Hello World",每个线程调用同一函数并使用`join()`等待所有线程完成。示例2使用`ThreadPoolExecutor`下载网页,创建线程池处理多个URL,打印出每个网页的大小。Python多线程还可用于线程间通信和同步,如使用Queue和Lock。
16 1
|
2天前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用合集之mysql通过flink cdc同步数据,有没有办法所有表共用一个dump线程
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
8 0
|
4天前
|
安全 C++
C++多线程编程:并发与同步
C++多线程编程:并发与同步
10 0
|
4天前
|
存储 安全 Java
Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列
Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列
|
4天前
|
监控 安全 Java
一文讲明白Java中线程与进程、并发与并行、同步与异步
一文讲明白Java中线程与进程、并发与并行、同步与异步
9 1
|
4天前
|
安全 算法 Java
Java中的多线程并发控制与同步机制
【4月更文挑战第17天】 在现代软件开发中,Java作为一种广泛使用的编程语言,其对多线程的支持是构建高性能应用程序的关键。本文将深入探讨Java中的多线程并发控制与同步机制,包括基本的线程创建、生命周期管理,以及高级的并发工具如synchronized关键字、ReentrantLock类、并发集合和原子变量等。通过理论分析与实例演示,旨在为读者提供一个清晰的多线程并发控制与同步的实现框架,并指出在实践中如何避免常见的并发问题,如死锁、竞态条件和资源争用等。
|
4天前
|
安全 Java 开发者
Java中的多线程并发控制与同步机制
【4月更文挑战第17天】在Java编程中,多线程是实现并行处理和提高程序性能的重要手段。然而,随之而来的线程安全问题和数据一致性问题不容忽视。本文深入剖析了Java中多线程的并发控制与同步机制,包括synchronized关键字、显式锁Lock以及并发集合等高级特性。通过对比分析这些机制的原理和使用场景,旨在帮助开发者理解并合理运用于实际项目中,以解决并发环境下的数据竞争和资源冲突问题。