Python中提供了threading模块来对多线程的操做,
1. 多线程实例
线程是应用程序中工做的最小单元。
多线程是现实有两种方式:
方法一:将要执行的方法做为参数传给Thread的构造方法(和多进程相似)
t = threading.Thread(target=action, args=(i,))
方法二:从Thread继承,并重写run()
看源码:
P = threading.Thread
p.start() _start_new_thread(self.__bootstrap, ()) self.__bootstrap_inner()
self.run()
try:
if self.__target:
self.__target(*self.__args, **self.__kwargs)
因此若是重写了run,就直接调用run的函数了,若是run没有从新,就调用target函数。python
#!/usr/bin/env python # -*- coding:utf-8 -*- # @File : demon1.py import threading def worker(n): print("start worker{0}".format(n)) class MyThread(threading.Thread): def __init__(self, args): super(MyThread, self).__init__() self.args = args def run(self): print("start MyThread{0}".format(self.args)) if __name__ == "__main__": for i in xrange(1, 6): t1 = threading.Thread(target=worker, args=(i,)) t1.start() t1.join() for x in xrange(6, 11): t2 = MyThread(x) t2.start() t2.join()
2. 线程锁
经过threading.Lock()来建立锁,函数在执行的只有先要得到锁,左后执行完之后要释放锁:
with lock:
lock.acquire()
lock.release()
实例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time
def worker(name, lock):
with lock:
print("start {0}".format(name))
time.sleep(5)
print("end {0}".format(name))
if __name__ == "__main__":
lock = threading.Lock()
t1 = threading.Thread(target=worker, args=("worker1", lock))
t2 = threading.Thread(target=worker, args=("worker2", lock))
t1.start()
t2.start()bootstrap
import threading import time def worker(name, lock): with lock: print("start {0}".format(name)) time.sleep(5) print("end {0}".format(name)) # with lock: # lock.acquire() # lock.release() if __name__ == "__main__": lock = threading.Lock() t1 = threading.Thread(target=worker, args=("worker1", lock)) t2 = threading.Thread(target=worker, args=("worker2", lock)) t1.start() t2.start() print("main end.")
3. 线程共享变量
多线程和多进程不一样之处在于多线程自己就是能够和父进程共享内存的,这也是为何其中一个线程挂掉之后,为何其余线程也会死掉的道理。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
l = list()
l += range(1, 10)
def worker():
l.append("ling")
l.append("shang")
l.append("hello")
if __name__ == "__main__":
t = threading.Thread(target=worker)
t.start()
print(l)数组
import threading def worker(l): l.append("ling") l.append("huo") l.append("wang") if __name__ == "__main__": l = list() l += range(1, 10) print(l) t = threading.Thread(target=worker, args=(l,)) t.start() print(l)
4. 线程池
经过传入一个参数组来实现多线程,而且它的多线程是有序的,顺序与参数组中的参数顺序保持一致。
安装包:
pip install threadpool
调用格式:
from threadpool import *
pool = ThreadPool(poolsize)
requests = makeRequests(some_callable, list_of_args, callback)
[pool.putRequest(req) for req in requests]
pool.wait()多线程
import threadpool def hello(m, n, o): """""" print "m = %s, n = %s, o = %s" % (m, n, o) if __name__ == '__main__': # 方法1 lst_vars_1 = ['1', '2', '3'] lst_vars_2 = ['4', '5', '6'] func_var = [(lst_vars_1, None), (lst_vars_2, None)] # 方法2 dict_vars_1 = {'m': '1', 'n': '2', 'o': '3'} dict_vars_2 = {'m': '4', 'n': '5', 'o': '6'} func_var = [(None, dict_vars_1), (None, dict_vars_2)] pool = threadpool.ThreadPool(2) requests = threadpool.makeRequests(hello, func_var) [pool.putRequest(req) for req in requests] pool.wait()