【python】多任务(1. 线程)
线程执行的顺序是不确定,可以通过适当的延时,保证某一线程先执行
基础语法
# 多线程的使用方式
import threading
def test1():...
# 如果创建Thread时执行的函数,运行结束,那么意味着,这个子线程结束了
def test2():...
def main():
t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
t2.start()
print(threading.enumerate())
if __name__ == '__main__':
main()
比较复杂的过程,通过类继承Thread类完成创建线程
import threading
import time
class MyThread(threading.Thread):
def fun(self):
for i in range(5):
time.sleep(1)
print("[%s]" % i)
if __name__ == '__main__':
t = MyThread()
t.start()
# start() 调用 self.run() , 涉及调用其它方法,到run函数中调用
多线程全局变量的共享
在一个函数中对全局变量进行修改的时候,到底是否需要使用global进行说明要看是否对全局变量的执行指向进行了修改,
如果修改了执行,即让全局变量指向了一个新的地方,那么必须使用global
如果,仅仅是修改了指向的空间中的数据,此时不必使用global
# 无参
import threading
import time
g_num = 100
def test1():
global g_num
g_num += 1
print("--------in test1 g_num=%d--------" % g_num)
def test2():
print("--------in test2 g_num=%d--------" % g_num)
def main():
t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
time.sleep(1)
t2.start()
time.sleep(1)
print("--------in main g_num=%d--------" % g_num)
if __name__ == '__main__':
main()
# 带参
import threading
import time
g_num = 100
def test1(temp):
temp.append(33)
print("--------in test1 g_nums=%s--------" % str(temp))
def test2(temp):
print("--------in test2 g_nums=%s--------" % str(temp))
g_nums = [11,22]
def main():
# target 去哪个函数执行代码
# args 带着什么过去的
t1 = threading.Thread(target=test1, args=(g_nums,))
t2 = threading.Thread(target=test2, args=(g_nums,))
t1.start()
time.sleep(1)
t2.start()
time.sleep(1)
print("--------in main g_nums=%s--------" % str(g_nums))
if __name__ == '__main__':
main()
多线程任务的资源竞争
import threading
import time
g_num = 0
def test1(num):
global g_num
for i in range(num):
g_num += 1
print("----in test1 g_num=%d----" % g_num)
def test2(num):
global g_num
for i in range(num):
g_num += 1
print("----in test2 g_num=%d----" % g_num)
def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,))
t1.start()
t2.start()
time.sleep(5)
print("----in main gnum=%d----" % g_num)
if __name__ == '__main__':
main()
"""
----in test1 g_num=1188472----
----in test2 g_num=1319841----
----in main g_num=1319841----
"""
互斥锁,避免资源竞争
import threading
import time
g_num = 0
def test1(num):
global g_num
# 上锁,如果之前没有被上锁,那么此时,上锁成功
# 如果上锁之前,已经被上锁了,那么此时会阻塞在这里,直到这个锁被解开为止
mutex1.acquire()
for i in range(num):
g_num += 1
mutex1.release()
print("----in test1 g_num=%d----" % g_num)
def test2(num):
global g_num
mutex1.acquire()
for i in range(num):
g_num += 1
mutex1.release()
print("----in test2 g_num=%d----" % g_num)
mutex1 = threading.Lock()
def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,))
t1.start()
t2.start()
time.sleep(1)
print("----in main gnum=%d----" % g_num)
if __name__ == '__main__':
main()
多线程版UDP聊天器
import socket
import threading
# 接收数据
def recv_msg(udp_socket):
while True:
recv_data,data_from = udp_socket.recvfrom(1024)
print("来自%s: [%s] " % (data_from, recv_data.decode('gbk')))
# 接收数据
def send_msg(udp_socket):
while True:
send_data = input("输入要发送的数据:")
udp_socket.sendto(send_data.encode('gbk'),("192.168.2.193", 8080))
def main():
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2. 绑定本地信息
udp_socket.bind(("", 7890))
# 对方的连接信息,用的固定值,没有用变量传递
# 创建两个线程
t_recv = threading.Thread( target=recv_msg, args=(udp_socket,))
t_send = threading.Thread( target=send_msg, args=(udp_socket,))
t_recv.start()
t_send.start()
if __name__ == '__main__':
main()
【python】多任务(1. 线程)的更多相关文章
- Python多任务之线程
多任务介绍 我们先来看一下没有多任务的程序 import time def sing(): for i in range(5): print("我喜欢唱") time.sleep( ...
- Python 多任务(线程) day2 (2)
同步 1.概念 :同步就是协同步调,按预定的先后次序运行 互斥锁 当多个线程几乎同时修改某一共享数据的时候,需要运行同步控制,最简单的同步机制是引入互斥锁.某个线程要更改共享数据时,先将其锁定,此时资 ...
- python多任务的实现:线程,进程,协程
什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务悄悄地在后 ...
- python 进程、线程与协程的区别
进程.线程与协程区别总结 - 1.进程是计算器最小资源分配单位 - 2.线程是CPU调度的最小单位 - 3.进程切换需要的资源很最大,效率很低 - 4.线程切换需要的资源一般,效率一般(当然了在不考虑 ...
- python学习笔记——线程threading (一)
1 线程threading 1.1 基本概述 也被称为轻量级的进程. 线程是计算机多任务编程的一种方式,可以使用计算机的多核资源. 线程死应用程序中工作的最小单元 1.2 线程特点 (1)进程的创建开 ...
- python多线程与线程
进程与线程的概念 进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I ...
- Python 基础之 线程与进程
Python 基础之 线程与进程 在前面已经接触过了,socket编程的基础知识,也通过socketserver 模块实现了并发,也就是多个客户端可以给服务器端发送消息,那接下来还有个问题,如何用多线 ...
- python day 20: 线程池与协程,多进程TCP服务器
目录 python day 20: 线程池与协程 2. 线程 3. 进程 4. 协程:gevent模块,又叫微线程 5. 扩展 6. 自定义线程池 7. 实现多进程TCP服务器 8. 实现多线程TCP ...
- Python进程、线程、协程
进程和线程的解释 进程(process)和线程(thread)是操作系统的基本概念,计算机的核心是CPU,它承担了所有的计算任务: 单个CPU一次只能运行一个任务,代表单个CPU总是运行一个进程,其他 ...
- python进程、线程、协程(转载)
python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资 ...
随机推荐
- [RN] React Native 好用的时间线 组件
React Native 好用的时间线 组件 效果如下: 实现方法: 一.组件封装 CustomTimeLine.js "use strict"; import React, {C ...
- 【BZOJ4722】由乃
[BZOJ4722]由乃 题面 bzoj 题解 考虑到区间长度为\(14\)时子集个数\(2^{14}>14\times 1000\),由抽屉原理,区间长度最多为\(13\)(长度大于这个值就一 ...
- nlp语义理解的一点儿看法
nlp领域里,语义理解仍然是难题! 给你一篇文章或者一个句子,人们在理解这些句子时,头脑中会进行上下文的搜索和知识联想.通常情况下,人在理解语义时头脑中会搜寻与之相关的知识.知识图谱的创始人人为,构成 ...
- TDD具体实施过程,可以看作两个层次
在代码层次,在编码之前写测试脚本,可以称为单元测试驱动开发(Unit Test Driven Development,UTDD) 在业务层次,在需求分析时就确定需求(如用户故事)的验收标准,即验收测试 ...
- Flume+Kafka+Storm+Redis 大数据在线实时分析
1.实时处理框架 即从上面的架构中我们可以看出,其由下面的几部分构成: Flume集群 Kafka集群 Storm集群 从构建实时处理系统的角度出发,我们需要做的是,如何让数据在各个不同的集群系统之间 ...
- Web Api 实现删除功能接口
删除数据 [HttpDelete] public ResultModel DeleteDataById(int id) { var result = new ResultModel(); //实例化数 ...
- SQLServer---------使用Excel 往sqlServer数据库中导入数据
1.右击创建好的表选择编辑200行 2.保证Excel的字段顺序与数据中顺序一致 3.选中好了后进行复制 4.打开文本 一个快捷方式 将excel 中的数据 黏贴放到文本中 5.点击sql ...
- c#栈的用法
栈是一种重要的线性结构,栈和队列是限定插入和删除只能在表的“端点”进行的线性表 –栈的元素必须“后进先出”. –栈的操作只能在这个线性表的表尾进行. –注:对于栈来说,这个表尾称为栈的栈顶(top), ...
- kafka集群安全化之启用kerberos与acl
一.背景 在我们部署完kafka之后,虽然我们已经可以“肆意”的用kafka了,但是在一个大公司的实际生产环境中,kafka集群往往十分庞大,每个使用者都应该只关心自己所负责的Topic,并且对其他人 ...
- APS.NET MVC + EF (02)---深入理解ADO.NET Entity Framework
2.7 深入理解Entity Framework 性能问题几乎是一切ORM框架的通病,对于EF来说,引起性能低的原因主要在以下几个方面. 复杂的对象管理机制为了在.NET中更好地管理模型对象,EF提供 ...