当数据量达到100W时候,单线程的程序,可能会跑2个小时。这个时间已经不算短了,加上可能程序有错误,需要修改,重跑。 所以需要寻求多线程的帮助。

01 初试多线程
任务: 文件easy.txt中放着0-9一共十个数字。 如果没有多线程的时候,就是写一个for循环,把这十个数字一次打印一遍。 现在想要起两个线程, 分别将这十个数字打印一遍。

这是easy.txt中的内容

[root@12.8.4.10 thread]# cat easy.txt 
0
1
2
3
4
5
6
7
8
9

下面是简单的程序

#coding:utf8


import threading,random
import time

class Cut(threading.Thread):
def __init__(self,content):
threading.Thread.__init__(self)
self.content = content


def run(self):
for i in self.content:
time.sleep(random.randrange(0,2))
print self.getName(),i


if '__main__' == __name__:

filename = "easy.txt"
f = open(filename)
content = f.read().split("\n")
content = content[:-1]
print

这个程序首先从 easy.txt文件中 读出内容, 按行分割, 放在列表中, 剔除最后一个空格, 打印了一下content中获取的内容。
Cut是我定义的线程类, 实例化一个Cut类,相当于 创建了一个线程, 我这里创建了两个线程 workman 和 workman2, 然后调用start()这个方法,这两个线程就开始工作了。

Cut类 继承自 threading.Thread 类。 需要重载run()这个方法,在实例start()方法调用后,将运行run()中的内容。 这个类初始化的时候,把content的内容传了进来。 按照计划,每个线程各自把 content中的数字打印一遍。 因为打印这个动作太快了,看不出两个线程的效果,所以在打印前,随机休息一小片时间。

我的输出结果是

[root@12.8.4.10 thread]# python work.py 
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
Thread-1 0
Thread-1 1
Thread-2 0
Thread-2 1
Thread-1 2
Thread-1 3
Thread-2 2
Thread-1 4
Thread-2 3
Thread-2 4
Thread-1 5
Thread-2 5
Thread-1 6
Thread-1 7
Thread-1 8
Thread-1 9
Thread-2 6
Thread-2 7
Thread-2 8
Thread-2 9
[root@12.8.4.10

从结果来看,程序工作的还算正常。 线程1 和 线程2 分别打印了 从0到9的十个数字。各自的行为没有收到对方线程的影响。 主线程也等待 两个线程都结束后才退出了。

在有些场合 这个程序是有用的,但大部分时候是没用的。 因为虽然分了两个线程, 可每个线程还是把数字都输出了一遍, 那我何必不只启动一个线程呢? 没有起到分担的作用。

为什么要使用多线程, 就是本文一开始说的, 现在有0到1000000 一百万的数据需要打印。 我一个线程顺序执行太慢了。 所以 希望 起多个线程 一起执行。 比如我起5个线程,我希望 每个线程大约能够 打印20W的数字, 这样就可以 把时间缩短到 五分之一 。

为了简便,还是举两个线程的例子吧, 如何把 0-9 这十个数字分配给 两个线程呢? 不能出现 某个数字被两个线程都处理了, 也不能漏掉某个数字。 这就是线程同步的问题 ,同步意思就是协作。 多个线程如何协作,如何配合呢, 请看下回分解。