之前用 C++ 做过一些多线程方面简单的东西,今天咱就用 Python 来试下多线程,并记录下来:

Python 多线程用途很广泛,可能使程序时间加快,多模块同时运行。爬虫爱好者爬取大量文件,图片,影音等,可以提升很大效率。

大多数编程语言一般情况是从 main 函数入口开始,随后按顺序执行,直到 return。
使用 C++ 举个简单的例子

    int main() {
        system("text1.txt");
        system("text2.txt");
        return 0;
    }

上面的例子中,目的分别是打开两个 txt 文本文档。但是当程序运行后却只打开了 text1, text2 没有打开。因为程序现在走到第一个 system 中,还没有结束。它在等待你关闭第一个打开的文件!!! 关闭打开的第一个文本文档后,发现第二个文本文档打开了。如果想同时打开两个文档,这个时候就可以用到多线程。

多线程原理都一样,主要利用计算机本身硬件或软件资源使多个线程可以并发执行。在不同编程语言中使用方法略有不同。
c++ 中需要导入头文件 thread 如果在 Win 上编程还需要导入 window.h。Python 中需要导入模块 threading 或者 _thread,推荐使用 threading。

今从某网站爬取图片,因为量大,所以使用多线程会提升很多效率。

    Thread1 = threading.Thread(target=url_img, args=(val,i,)).start()

代码中使用 Thread 创建一个线程
target 为函数名,将此函数携带参数后抛出主线程运行
args 为参数列表,必须为 tuple 类型,传递一个值时切记后边带上 , 号 (1) 和 (1,)可不一样哦
kwargs 也是传参,不过是字典类型,显式的传参。指名道姓给哪个
其他参数可查资料

线程创建成功,调用 start() 函数启动线程。此时,程序就会多出一个出口。别忘了在最后使用 join() 释放线程

如果同时爬取,同时访问某一个变量,或者同时写一个文件,需要用到 ,主要的两个方法 acquire release

    global s
    lock = threading.Lock() 
    lock.acquire()
    s += 1
    lock.release()

设置爬取总量 s,声明全局变量,然后声明一个锁。在 acquire 和 release 方法之间的代码运行时,其他进程就会被 “锁上” 防止出现数据错误或者 BUG。

此次爬取图片分三个线程,可以看到三个线程分工同时进行,爬取数百张效率提升很大。