当数据量达到100W时候,单线程的程序,可能会跑2个小时。这个时间已经不算短了,加上可能程序有错误,需要修改,重跑。 所以需要寻求多线程的帮助。
01 初试多线程
任务: 文件easy.txt中放着0-9一共十个数字。 如果没有多线程的时候,就是写一个for循环,把这十个数字一次打印一遍。 现在想要起两个线程, 分别将这十个数字打印一遍。
这是easy.txt中的内容
下面是简单的程序
这个程序首先从 easy.txt文件中 读出内容, 按行分割, 放在列表中, 剔除最后一个空格, 打印了一下content中获取的内容。
Cut是我定义的线程类, 实例化一个Cut类,相当于 创建了一个线程, 我这里创建了两个线程 workman 和 workman2, 然后调用start()这个方法,这两个线程就开始工作了。
Cut类 继承自 threading.Thread 类。 需要重载run()这个方法,在实例start()方法调用后,将运行run()中的内容。 这个类初始化的时候,把content的内容传了进来。 按照计划,每个线程各自把 content中的数字打印一遍。 因为打印这个动作太快了,看不出两个线程的效果,所以在打印前,随机休息一小片时间。
我的输出结果是
从结果来看,程序工作的还算正常。 线程1 和 线程2 分别打印了 从0到9的十个数字。各自的行为没有收到对方线程的影响。 主线程也等待 两个线程都结束后才退出了。
在有些场合 这个程序是有用的,但大部分时候是没用的。 因为虽然分了两个线程, 可每个线程还是把数字都输出了一遍, 那我何必不只启动一个线程呢? 没有起到分担的作用。
为什么要使用多线程, 就是本文一开始说的, 现在有0到1000000 一百万的数据需要打印。 我一个线程顺序执行太慢了。 所以 希望 起多个线程 一起执行。 比如我起5个线程,我希望 每个线程大约能够 打印20W的数字, 这样就可以 把时间缩短到 五分之一 。
为了简便,还是举两个线程的例子吧, 如何把 0-9 这十个数字分配给 两个线程呢? 不能出现 某个数字被两个线程都处理了, 也不能漏掉某个数字。 这就是线程同步的问题 ,同步意思就是协作。 多个线程如何协作,如何配合呢, 请看下回分解。