python多任务线程

文章目录


Tesseract安装以及简介

阻碍爬虫的。有时候正是在登录或者请求一些数据时候的图形验证码。能将图片翻译成文字被称为光学文字识别(Optical Character Recognition),简写为OCR。介绍一个图像识别开源库:Tesseract。
Windows系统安装 在以下链接下载可执行文件,https://github.com/tesseract-ocr/
在Python中调用Tesseract需要安装pytesseract:

pip install -i https://pypi.douban.com/simple/ pytesseract
  • 设置环境变量
    安装完成后,如果想要在命令行中使用Tesseract,那么应该设置环境变量。Mac和Linux在安装的时候就默认已经设置好了。在Windows下把tesseract.exe所在的路径添加到PATH环境变量中。
    还有一个环境变量需要设置的是,要把训练的数据文件路径也放到环境变量中。 在环境变量中,添加一个TESSDATA_PREFIX=D:\Tesseract-OCR\tessdata
    进入cmd输入下面的命令查看版本,正常运行则安装成功
tesseract --version
  • 在命令行中使用tesseract
    格式:tesseract 图片路径 文件路径
tesseract demo.png a

在代码中使用tesseract识别图像

import pytesseract
from PIL import Image  # python图像处理库
from urllib import request

# 指定tesseract的驱动
pytesseract.pytesseract.tesseract_cmd = r'E:\Tesseract-OCR\tesseract.exe'
# 指定tesseract的训练数据的路径
tessdata_dir_config = r'--tessdata-dir "E:\Tesseract-OCR\tessdata"'
url = 'https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891'
request.urlretrieve(url, 'text.png')
image = Image.open('text.png')
result = pytesseract.image_to_string(image, lang='eng', config=tessdata_dir_config)
print(result)

用pytesseract处理图形验证码
验证码URL:https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891

主线程和子线程的执行关系

主线程会等待子线程结束之后在结束
join() 等待子线程结束之后,主线程继续执行
setDaemon() 守护线程,不会等待子线程结束

import threading
import time

def demo():
    # 子线程
    print("hello girls")
    time.sleep(1)
    
if __name__ == "__main__":
    for i in range(5):
        t = threading.Thread(target=demo)
        t.start()
  • 查看线程数量
import threading
import time


# threading.enumerate()
# name = ['a','b','c']
# for index,i in enumerate(name):
#     # print(i,type(i))
#     print(index,i)

def demo1():
    for i in range(5):
        print('demo1--%d' % i)
        time.sleep(1)


def demo2():
    for i in range(10):
        print('demo2--%d' % i)
        time.sleep(1)


def main():
    t1 = threading.Thread(target=demo1)
    t2 = threading.Thread(target=demo2)
    t1.start()
    t2.start()
    while True:
        print(threading.enumerate())
        if len(threading.enumerate()) <= 1:
            break
        time.sleep(1)


if __name__ == '__main__':
    main()

当调用Thread的时候,不会创建线程。
当调用Thread创建出来的实例对象的start方法的时候,才会创建线程以及开始运行这个线程

线程间的通信(多线程共享全局变量)

在一个函数中,对全局变量进行修改的时候,是否要加global要看是否对全局变量的指向进行了修改,如果修改了指向,那么必须使用global,仅仅是修改了指向的空间中的数据,此时不用必须使用global
线程是共享全局变量。

  • 多线程传递参数用args
threading.Thread(target=test, args=(num,))
import threading
import time

num = 0


def demo1(nums):
    global num
    for i in range(nums):
        num += 1
    print('demo1-num-%d' % num)


def demo2(nums):
    global num
    for i in range(nums):
        num += 1
    print('demo2-num-%d' % num)


def main():
    t1 = threading.Thread(target=demo1, args=(1000000,))
    t2 = threading.Thread(target=demo2, args=(1000000,))
    t1.start()
    t2.start()
    time.sleep(3)
    print('main-num-%d' % num)


if __name__ == '__main__':
    main()
上一篇:python: 多线程实现的两种方式及让多条命令并发执行


下一篇:python 多线程