在了解多线程前先给大家介绍下并发和并行:

  并发:多个任务一起执行 在多任务之间快速切换处理 任务数量大于cpu核数

   并行:一个cpu核处理一个任务,多个cpu核同时处理多个任务 任务数量等于或者小于cpu核数

再介绍下同步和异步 :

  同步:指线程在访问某一资源时,获得了资源的返回结果之后才会执行其他操作(先做某件事,再做某件事)

  异步: 与同步相对,是指线程在访问某一资源时,无论是否取得返回结果,都进行下一步操作;当有了资源返回结果时 系统自会通知线程

在Python中,使用threading库来创建多线程

import threading

def func1():
for i in range(6):
time.sleep(1) def func2():
for i in range(5):
time.sleep(1) # 创建线程对象
t2 = threading.Thread(target=func2) # target = 方法名
t1 = threading.Thread(target=func1, name='线程1') # 可以设置线程名字
# start 启动线程活动
# join([time]) 设置主线程会等待time秒后再往下执行,time默认为子线程结束,多个子线程之间设置的值会增加
# isAlive 返回线程是否活动的
# getName() 返回线程名
# setName() 设置线程名 a = time.time()
t2.start() # 开始执行线程2
t1.start() # 开始执行线程1
# 让主线程等待子线程执行完后再继续往下执行 同步的概念
t2.join()
t1.join()
b = time.time()
c = b - a
print(c) threading.currentThread() # 返回当前执行的线程
threading.enumerate() # 返回正在运行的所有线程(list) 正在运行指:启动后、结束前,不包括了启动前和终止后的线程
threading.activeCount() # 返回正在运行的线程数量

在threading库中调用start方法后,start方法调用了他内部的run()方法,我们可以通过继承threading重写run()方法来批量创建线程,代码如下

import threading
import requests
import time # 通过继承 threading 类来创建线程 重写run方法 因为start方法调用的就是run 重写run
class MyClass(threading.Thread):
def __init__(self, url):
self.url = url
super().__init__() # 如果要传入参数重写init方法时,一定要调用父类的init方法 # 发送requests请求 def run(self):
res = requests.get(self.url)
print('线程{},返回{}'.format(threading.current_thread(), res.status_code)) t1 = time.time()
for i in range(5):
t = MyClass('https://www.baidu.com')
t.start()
t.join()
t2 = time.time()
print(t2 - t1)

可以通过直接实例化类来创建线程对象,如果要传入参数,在重写init方法时要注意在最后调用父类的init方法,具体原因可以去查看thrreading库是如何实现的,在init方法中有很多其他的代码需要执行。

多线程共享全局变量:

在python中是使用单核来处理线程的,也就是并发并非并行,代码示例如下:

import threading

a = 100

def func1():
for i in range(100000):
global a
a += 1
print(a) def func2():
for i in range(100000):
global a
a += 1
print(a) t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t1.start()
t2.start()

当执行func1()方法时,获取全局变量为100,此时暂停切换到func2()方法,获取全局变量a为100,并进入for循环,当a循环到20000时(举例),又切换到func1()方法中开始执行for循环,此时在func1()中a的值为100,循环1次后把a的值又更新为101,造成数据不准确。

解决这个问题会用到互斥锁、同步、队列,在下一篇会给大家讲到

Pyhton多线程的更多相关文章

  1. 关于Pyhton多线程同步队列的应用

    ''' 同步队列 put方法和task_done方法, queue有一个未完成任务数量num,put依次num+1, task依次num-1.任务都完成时任务结束. 1.创建一个 Queue.Queu ...

  2. python 多线程编程之threading模块(Thread类)创建线程的三种方法

    摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...

  3. Java 多线程实现方式三:实现 Callable 接口

    完整套路 java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值. 基本套路: 1. 创建目标对象 2. 创建执 ...

  4. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  5. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  7. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  8. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  9. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

随机推荐

  1. HTML5 Canvas(基础知识)

    最近笔者在学习HTML5的新元素<canvas>,会分享一些基础知识以及小例子,最终使用<canvas>实现一个绘制简单图表(条形图.线图或者饼图)的js库,会更新一到两篇文章 ...

  2. [LeetCode] 994. Rotting Oranges 腐烂的橘子

    题目: 思路: 每个腐烂的橘子都能将自己上下左右的新鲜橘子传染,像极了现在的肺炎... 如果格子中只有一个腐烂的橘子,那么这便是一个典型的层次遍历,第一个传染多个,称为第二层,第二层传染第三层 但这里 ...

  3. flask 分页数据显示

    填充一些数据在表中 @blue.route('/pages/') def pages(): # 默认进入这个视图函数 第一页并只显示5条数据 page = request.args.get('page ...

  4. 学会了这些redis知识点,面试官会觉得你很nb(转自十年技术大牛)

    是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义.redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有数据类型的,只有把它们 ...

  5. 菜鸟对java和Go的理解

    1.go对比java go通过结构体嵌套+接口实现类似面向对象中的继承和多态.个人认为尤其是go的接口抓住了多态的本质.而Go提倡的面向接口的思想也可能使得架构上更加解耦. 2.关于Go不要通过共享内 ...

  6. kerberos系列之kerberos安装

    最近搞了一下kerberos,准备写一个系列,介绍kerberos的安装,和常用组件kerberos配置,今天进入第一篇:kerberOS安装 具体kerberos是什么东西,大家可以百度查一下,这里 ...

  7. 33. CentOS7 静态ip设置

    1.网络连接选择NAT模式: 2.关闭vmware的dhcp:选择编辑-->虚拟网络编辑器,选择VMnet8,去掉使用本地DHCP服务将ip地址分配给虚拟机(D). 3. 点击NAT设置(S)查 ...

  8. SCF(SenparcCoreFramework) 系列教程(一):项目介绍及快速搭建

    2020年3月25日的“盛派周三分享”活动首次使用直播的方式与大家见面,共有 500 多人参与了活动,得到了众多开发者的好评,并强烈要求我分享 PPT,这点要求当然必须满足啦! 除此以外,还有许多开发 ...

  9. MySQL 教程--检视阅读

    MySQL 教程--检视阅读 准备:Windows 上安装 MySQL 教程地址,PHP语言基础 教程地址2 教程地址3,有讲数据库的备份和恢复 教程地址4,w3c.china,php基础,扩展阅读 ...

  10. [暴力+前缀和]2019牛客暑期多校训练营(第六场)Upgrading Technology

    链接:https://ac.nowcoder.com/acm/contest/886/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...