第一章   线程的使用

并发:指的是任务数多余cpu核数

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

1.线程的概念

线程就是在程序运行过程中,执行程序代码的一个分支,每个运行的程序至少都有一个线程。

1.进程至少有一个线程叫主线程

2.主线程要等其他线程执行完再结束

2.单线程的执行

必须一个个的执行

3.多线程

1.导入线程模块

import threading

from threading import Thread

2.线程类的Thread参数说明

group: 线程组,目前只能使用None

target: 执行的目标任务名

args: 以元组的方式给执行任务传参

kwargs: 以字典方式给执行任务传参

name: 线程名,一般不用设置

4.创建线程

创建线程,线程对象会sleeping(需要等cpu来调用)

启动线程

线程对象.start()

理解部分:

1.等待区(休眠区):创建线程的时候和线程执行期被停止

2.执行区

3.死亡区  等待销毁

5.查看获取的线程列表

threading.current_thread() 获取当前执行代码的线程

threading.enumerate() 获取当前程序活动线程的列表

每一个程序至少有一个线程---->主线程

总结:1.线程没有执行是不会进入到活动的线程列表

<只有线程启动,线程才会加入到活动列表>

2.子线程进行的时候,主线程也在进行

3.如果主线程直接退出没有等待子线程,子线程会被销毁

例:

from time import sleep

# from threading import Thread

import threading

def cc(cctv):

for i in range(cctv):

print("ss",i)

sleep(0.5)

def bb(cctv):

for i in range(cctv):

print("bb",i)

sleep(1)

if __name__ == '__main__':

print("创建主线程",threading.current_thread())

print("执行主线程",threading.enumerate())

print("创建线程22222",threading.current_thread())

cc1 = threading.Thread(target=cc,name="11",kwargs={"cctv":3})

bb1 = threading.Thread(target=bb,name="22",args=(3,))

cc1.start()

print("执行线程22222",threading.enumerate())

bb1.start()

print("创建线程33333",threading.current_thread())

print("执行线程33333",threading,enumerate)

6.线程注意点

a).线程之间执行是无序的

b).主线程会等待所有的子线程结束后才结束

C).守护主线程

daemon = True :守护主线程

设置守护主线程,让创建的线程停止daemon = True

7.设置守护主线程

daemon = True

就是守护了后面的线程就不执行了

例:

from threading import Thread

def cc():

for i in range(3):

print("我在打游戏",i)

if __name__ == '__main__':

cc1 = Thread(target=cc)

cc1.daemon = True

cc1.start()

print("你不可以在我前面打游戏")

8.阻塞主线程(使用阻塞的前提,子线程被守护)

a).卡时间点 用sleep()

b).使用 线程名字.join([time])  time默认为子线程执行完毕的时间none

例:

from threading import Thread

def cc():

for i in range(3):

print("我在打游戏",i)

if __name__ == '__main__':

cc1 = Thread(target=cc)

cc1.daemon = True

cc1.start()

cc1.join()

print("你不可以在我前面打游戏")

就是用join()了可以阻塞主线程让线程执行完毕

9.自定义线程

必须重写Thread类中的run方法

run方式是用来执行任务的(绑定任务的)

执行自定义的线程时,不能通过线程对象调用run()

而是使用start()方法执行线程

例:

import threading

class MY(threading.Thread):

def __init__(self,show1,show2):

super(MY,self).__init__()

self.show1 = show1

self.show2 = show2

def test1(self):

print(self.show1)

def test2(self):

print(self.show2)

def run(self) :

self.test1()

self.test2()

s = MY("测试1","测试2")

s.start()

就是在run()中调用在下面执行

自定义线程不能指定target,因为自定义线程里面的任务都统一在run方法里面执行

10.多线程---共享全局变量

主线程和多个子线程会使用定义的全局变量

解决资源竞争问题

让线程‘同步’:协同步调,让多个线程执行有一个顺序

a.让先启动的线程阻塞主线程  join

b.使用互斥锁

缺点:一旦让线程同步了,会导致程序的效率变低,使本来的多线程变为单线程

例:

import threading

from time import sleep

sss = []

def A():

for i in range(5):

sss.append(i)

sleep(0.1)

print("存入的值",sss)

def B():

print("读取的值",sss)

if __name__ == '__main__':

aa = threading.Thread(target=A)

bb = threading.Thread(target=B)

aa.start()

aa.join()

bb.start()

11.互斥锁

互斥锁:保证只有一个线程拿到全局资源

使用过程:

a.需要给使用同一个全局资源的线程上锁

b.先上锁占用全局资源

c.执行完之后再去释放锁

代码使用过程:

a.先创建锁    threading.Lock()--->全局锁的对象

该互斥锁对象必须为全局变量

b.给线程上锁  互斥锁的对象.acquire()

c.释放锁      互斥锁的对象.release()

互斥锁为资源引入一个状态:锁定/非锁定

例:

import threading

num = 0

s = threading.Lock()         #创建锁

def A():

s.acquire()    #上锁

for i in range(1000000):

global num

num+=1

print("A:",num)

s.release()      #释放锁

def B():

s.acquire()   #上 锁

for i in range(1000000):

global  num

num+=1

print("B:",num)

s.release()         #释放锁

if __name__ == '__main__':

aa = threading.Thread(target=A)

bb = threading.Thread(target=B)

aa.start()

# aa.join()                 #用.join()一样

bb.start()

12 死锁

死锁:一直等待对方释放锁,一但发生就会造成应用的停止响应,避免死锁就要在合适的地方释放锁

python获取当前线程_Python爬虫(线程,进程)相关推荐

  1. python获取登录按钮_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。

    昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...

  2. python获取网站代码_python爬虫1——获取网站源代码(豆瓣图书top250信息)

    # -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...

  3. python获取登录按钮_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈

    ​昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第 ...

  4. python获取交通线路_Python爬虫_城市公交、地铁站点和线路数据采集实例

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. python爬虫进程和线程_python爬虫番外篇(一)进程,线程的初步了解-阿里云开发者社区...

    整理这番外篇的原因是希望能够让爬虫的朋友更加理解这块内容,因为爬虫爬取数据可能很简单,但是如何高效持久的爬,利用进程,线程,以及异步IO,其实很多人和我一样,故整理此系列番外篇 一.进程 程序并不能单 ...

  6. python可以开多少线程_python爬虫可以开多少线程?

    其实关于爬虫并没有明确多少数量开线程,因为这个是无穷的,随着时代的不断发展,每一个革新都给我们焕然一新的感觉,可能大家现在在学习的时候,已知内容是有限的,真正在不断探索以后,会发现这个内容是无穷了,小 ...

  7. python获取电脑几核几线程_python编程测试电脑开启最大线程数实例代码

    本文实例代码主要实现python编程测试电脑开启最大线程数,具体实现代码如下. #!/usr/bin/env python #coding=gbk import threading import ti ...

  8. python结束线程池正在运行的线程_python之线程与线程池

    #进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程.#传统的不确切使用线程的程序称为只含有一个线程或单线程程序,而可以使用线程的程序被称为多线程程序,在程序中使用一个线 ...

  9. AI学习_线程_python爬虫_numpy

    线程: #线程同步(线程安全) #同步:效率低,安全度高 #异步:效率高,安全度低 #在绝大部分代码中,都是线程异步,因为效率最高 #只有极少部分,在对安全性要求高的,才是线程同步 matplotli ...

最新文章

  1. 690.员工的重要性
  2. Linxu 进程描述符task_struct
  3. Android获取手机短信
  4. CheckedListBox扩展方法代码
  5. 防抖debounce和节流throttle
  6. mysql 表迁移 并筛选,如何使MySql View在获取时筛选每个表
  7. 文科生必备计算机知识点,文科生计算机知识点调查报告.docx
  8. ABAP 自建透明表维护
  9. java5 离线安装包_ElasticSearch 5.5 离线环境的完整安装及配置详情,附kibana、ik插件配置及安装包下载路径...
  10. android root工具twrp,Android手机-全程解析最新Root通用方法
  11. 什么是Promise?Promise有什么好处
  12. 10分钟健身法读书笔记(5/5)
  13. mysql 主从 只读,mysql主从复制(从库只读)
  14. android opengl ppt,Opengl example.ppt
  15. 主编编辑器如何在文章下方插入往期回顾?
  16. 模拟微信接口时,提示“请在微信客户端打开链接”(转)
  17. 【Python应用】自制截图取词小工具-- 解锁文字识别新姿势
  18. codevs 2964 公共素数因数
  19. try..catch捕获不到空指针等异常的问题
  20. 瑞星微RK3288 核心板

热门文章

  1. 静态导入 java面试_Java面试系列【静态导入】-静态导入,基础篇
  2. in作为介词的用法_(完整版)介词in重要用法归纳
  3. python右键弹出菜单编写_python实现应用程序在右键菜单中添加打开方式功能
  4. git push 报错git: push-u is not a git command. See 'git --help'.
  5. Linux 如何开启SFTP
  6. LInux之gz文件压缩/解压缩
  7. js获取前一天/后一天
  8. 如何在maven repository手动下载jar包
  9. 基于 Jenkins + JaCoCo 实现功能测试代码覆盖率统计
  10. 092:QuerySet API详解-切片操作