Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230708
  • 博文数量: 57
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 557
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-01 18:05
文章分类

全部博文(57)

文章存档

2017年(57)

我的朋友

分类: Python/Ruby

2017-12-13 11:34:37

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函数。

代码实例如下:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-12-13 11:35
  5. # @file :10.py


  6. import threading

  7. def worker(n):
  8.     print ("start worker{0}".format(n))


  9. class MyThread(threading.Thread):
  10.     def __init__(self, args):
  11.         super(MyThread, self).__init__()
  12.         self.args = args

  13.     def run(self):
  14.         print ("start MyThread{0}".format(self.args))



  15. if __name__ == '__main__':
  16.     for i in xrange(1, 6):
  17.         t1 = threading.Thread(target=worker,args=(i,))
  18.         t1.start()
  19.     t1.join()

  20.     for x in xrange(6, 11):
  21.         t2=MyThread(x)
  22.         t2.start()
  23.     t2.join()
执行结果:

start worker1
start worker2
start worker3
start worker4
start worker5
start MyThread6
start MyThread7
start MyThread8
start MyThread9
start MyThread10

线程锁

通过threading.Lock()来创建锁,函数在执行的只有先要获得锁,左后执行完以后要释放锁:

with lock:

lock.acquire()

lock.release()

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-12-13 10:50
  5. # @file :9.py


  6. import threading
  7. import time
  8. def worker(name, lock):
  9.     with lock:
  10.         print("start {0}".format(name))
  11.         time.sleep(5)
  12.         print("end {0}".format(name))

  13. if __name__ == "__main__":
  14.     lock = threading.Lock()
  15.     t1 = threading.Thread(target=worker, args=("worker1", lock))
  16.     t2 = threading.Thread(target=worker, args=("worker2", lock))
  17.     t1.start()
  18.     t2.start()
执行结果:
start worker1
end worker1
start worker2
end worker2







阅读(1671) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~