线程执行的顺序是不确定,可以通过适当的延时,保证某一线程先执行

基础语法

# 多线程的使用方式

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多任务_【python】多任务(1. 线程)相关推荐

  1. 初识python 视频_#python day02 初识python 学习视频来源于 太白金星

    #python day02 初识python 学习视频来源于 太白金星 ''' 知识点:安装PyCharm''' # 设置鼠标条件字体大小:file ->settings # 搜索mouse E ...

  2. 汉诺塔问题递归算法python代码_[python]汉诺塔问题递归实现

    一.问题描述及算法步骤 汉诺塔问题的大意是有三根柱子a, b, c,现在a柱有N个盘子从下往上尺寸递减排列,要求: 1. 将a上的盘子移动到c柱上; 2. 每次移动一个盘子; 3. 柱子上的盘子始终必 ...

  3. python数据模型_#PYTHON#数据模型 | 学步园

    今天,谈谈python中的数据模型,当然你可以不了解这些东西,照样可以写出漂亮的python代码,但是"知其然知其所以然"是我的作风,总是不明白python的一些机制,心里很不爽. ...

  4. python评价指标_[Python人工智能] 六.神经网络的评价指标、特征标准化和特征选择...

    从本系列文章开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前五篇文章讲解了神经网络基础概念.Theano库的安装过程及基础用法.theano实现回归神经网络.theano实现 ...

  5. 小甲鱼python笔记_[Python]之前初学python,看小甲鱼视频的笔记(未整理)

    BIF == Built-in functions (内置函数) 用冒号: 而不是分号: 001作业 0.Python是一种面向对象的脚本语言. 1.IDLE是python的一个shell. 2.输出 ...

  6. python低通滤波器_[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波

    [Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波 发布时间:2019-04-28 20:35, 浏览次数:2739 , 标签: Python 该系列文章是讲解Python OpenCV ...

  7. python 递归函数 - 刘江的python教程_[PYTHON系列教程]→递归函数

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:fa ...

  8. python队列长度_[python模块]队列queue

    一.队列queue 队列queue 多应用在多线程场景,多线程访问共享变量. 对于多线程而言,访问共享变量时,队列queue的线程安全的. 因为queue使用了一个线程锁(pthread.Lock() ...

  9. python 错误代码_[python]WindowsError的错误代码详解

    转自:http://www.aichengxu.com/view/46906 WindowsError的错误代码详解 0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. ...

  10. 哆啦a梦简单图画python编程_[python]画哆啦A梦,Python,绘制

    from turtle import * #无轨迹跳跃 defmy_goto(x, y): penup() goto(x, y) pendown()#眼睛 defeyes(): fillcolor(& ...

最新文章

  1. vb asp.net的一些属性值
  2. 【数据结构-排序】5.九种排序设计分析
  3. opencv学习笔记1:图片读入,显示与保存(有代码)
  4. 获取Windows Shell的简单示例程序二
  5. Spark连接hive
  6. IEnumerable和使用收益回报的递归
  7. oracle分段分组函数,Oracle增强型分组函数
  8. git branch看不到分支_这份Git 日常操作清单,你都用到了吗
  9. Spring揭秘-笔记
  10. 深度森林实现时间序列预测(Python)
  11. destoon使用教程之经典调用方法汇总
  12. 【人工智能Prolog】mother、father和grandpa
  13. 牛郎织女都见面,而你却在吃狗粮---男士星座脱单指南
  14. 计算机过滤器的作用,前置过滤器有什么好处 前置过滤器好处介绍【详解】
  15. 微信小程序php后端接收小程序前端数组(array)
  16. Idea将Java文件导出jar包
  17. D. 互联网架构模板
  18. java html合并单元格内容居中显示_合并Al:H1单元格区域,使合并的内容居中显示。...
  19. 解决[1]:XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'id\xef\xbc\x8cage
  20. 教你一招搞定 Homebrew 下载加速!

热门文章

  1. java 获取classpath下文件多种方式
  2. lm016l c语言编程,基于MCS51-LM016L (液晶屏)
  3. Django shell保存数据
  4. 很多人现在还不知道的知识点,Python多进程和多线程详解!
  5. Python getattr() 函数
  6. 腾讯云实验之Linux 基础入门
  7. 零基础入门深度学习(7) - 递归神经网络
  8. 深度学习 《梯度消失和梯度爆炸》
  9. 漫步最优化三十二——最速下降法
  10. wpf中左侧导航的实现