thread 多线程

一、为什么重写mythread类里写了run()在main里没有调用,而调用了没有写的start()

start()让run()在新线程里面运行。你直接调用run()就是在当前线程运行了。

start()调用_thread的start_new_thread去运行一个bootstrap方法,在里面做一些准备工作后会调用run()

1.简单的多线程

  1. from time import sleep, ctime
  2. import threading
  3. def fab(x):
  4. sleep(5)
  5. print ‘fab‘, ctime()
  6. if x < 3:
  7. return 1
  8. return (fab(x-1)+fab(x-2))
  9. def sumx(x):
  10. sleep(5)
  11. print ‘sumx‘, ctime()
  12. if x < 2:
  13. return 1
  14. return (x+sumx(x-1))
  15. def mulx(x):
  16. sleep(5)
  17. print ‘mulx‘, ctime()
  18. if x < 2:
  19. return 1
  20. return (x*mulx(x-1))
  21. def main():
  22. a = threading.Thread(target=fab, args=(1,))
  23. sleep(1)
  24. b = threading.Thread(target=sumx, args=(1,))
  25. sleep(1)
  26. c = threading.Thread(target=mulx, args=(1,))
  27. a.start()
  28. b.start()
  29. c.start()
  30. print threading.activeCount()
  31. print threading.enumerate()
  32. a.join()
  33. b.join()
  34. c.join()
  35. if __name__ == ‘__main__‘:
  36. main()

二、复杂的多线程

  1. import threading
  2. from time import sleep, ctime
  3. loops = [4, 2]
  4. class MyThread(threading.Thread):
  5. def __init__(self, func, args, name=‘‘):
  6. threading.Thread.__init__(self)
  7. self.name = name
  8. self.func = func
  9. self.args = args
  10. def getResult(self):
  11. return self.res
  12. def run(self):
  13. print ‘starting‘, self.name, ‘at:‘, ctime()
  14. self.res = apply(self.func, self.args)
  15. print self.name, ‘finished at:‘, ctime()
  16. def fib(x):
  17. sleep(0.005)
  18. if x < 2: return 1
  19. return (fib(x-2) + fib(x-1))
  20. def fac(x):
  21. sleep(0.1)
  22. if x <2: return 1
  23. return (x * fac(x-1))
  24. def sum(x):
  25. sleep(0.1)
  26. if x <2: return 1
  27. return (x + sum(x-1))
  28. funcs = [fib, fac, sum]
  29. n = 12
  30. def main():
  31. nfuncs = range(len(funcs))
  32. print ‘*** SINGLE THREAD‘
  33. for i in nfuncs:
  34. print ‘starting‘, funcs[i].__name__, ‘at:‘, ctime()
  35. print funcs[i](n)
  36. print funcs[i].__name__, ‘finished at:‘, ctime()
  37. print ‘\n*** MULTIPLE THREADS‘
  38. threads = []
  39. for i in nfuncs:
  40. t = MyThread(funcs[i], (n,), funcs[i].__name__)
  41. threads.append(t)
  42. for i in nfuncs:
  43. threads[i].start()
  44. for i in nfuncs:
  45. threads[i].join()
  46. print threads[i].getResult()
  47. print ‘all DONE‘
  48. if __name__ == ‘__main__‘:
  49. main()

三.多线程实例同时下载网页,args传入参数为元组

  1. import urllib
  2. import threading
  3. url = [‘http://www.baidu.com‘, ‘http://pan.baidu.com‘, ‘http://tieba.baidu.com‘]
  4. def openurl(url, x):
  5. urllib.urlretrieve(url, ‘d:\\‘+str(x)+‘.txt‘)
  6. def main():
  7. print ‘start...........‘
  8. list1 = []
  9. loops = range(len(url))
  10. for i in loops:
  11. t = threading.Thread(target=openurl, args=(url[i],i))
  12. list1.append(t)
  13. for i in loops:
  14. list1[i].start()
  15. for i in loops:
  16. list1[i].join()
  17. print ‘all down‘
  18. if __name__ == ‘__main__‘:
  19. main()

四、实例化类继承类初始化,重写run()函数

  1. import urllib
  2. import threading
  3. url = [‘http://www.baidu.com‘, ‘http://pan.baidu.com‘, ‘http://tieba.baidu.com‘]
  4. class downloader(threading.Thread):
  5. def __init__(self, url, x):
  6. threading.Thread.__init__(self)
  7. self.url = url
  8. self.x = x
  9. def run(self):
  10. urllib.urlretrieve(self.url, ‘d:\\‘+str(self.x)+‘.txt‘)
  11. for i in range(len(url)):
  12. i = downloader(url[i], i)
  13. i.start()

来自为知笔记(Wiz)

时间: 2024-12-09 01:29:42

thread 多线程的相关文章

Boost::Thread 多线程的基础知识

Boost.Thread可以使用多线程执行可移植C++代码中的共享数据.它提供了一些类和函数来管理线程本身,还有其它一些为了实现在线程之间同步数据或者提供针对特定单个线程的数据拷贝.头文件:#include <boost/thread.hpp> 线程定义boost::thread 类是负责启动和管理线程.每个boost::thread对象代表一个单独的执行线程,是不可拷贝的.由于它是可以被移动到,所以它们可以被保存到会改变大小的容器中,并且从函数返回.这使得线程创建的详细信息可以被封装到一个函

C++11 Thread多线程的学习心得与问题

C++11 ,封装了thread的多线程的类,这样对多线程的使用更加方便. 多线程的原理我不加赘述,可以参看操作系统等参考书. 多线程代码可以最大化利用计算机性能资源,提高代码的运行效率,是常用优化方法. 我不是C++大神,初学阶段的菜鸟而已,很多问题我还是不理解当中的原理,写这篇博客的原因,也是记录自己的学习心得和思路,供自己日后自己思考. 首先从简单的问题入手,如何写一个多线程的C++代码? #include<iostream> #include<thread> void fu

Thread多线程stopSleep顺序问题

今天呢,学习了javase多线程,里面的睡眠sleep问题有点困扰: public class Thread_06_stopSleep{ public static void main(String[] args)throws Exception{ Processor p = new Processor(); Thread t = new Thread(p); t.start();// Thread.sleep(5000);//Thread:代表了当前代码所在的类那个线程,main() for(

新手浅谈Task异步编程和Thread多线程编程

初学Task的时候上网搜索,看到很多文章的标题都是task取代thread等等相关,我也一直以为task和thread是一类,其实task是.net4.0提出的异步编程,在之前.net1.0有delegete.beginInoke(XXXX),还有.net2.0中的EAP,在最新的4.5中又有async.await这种新的异步编程.而Thread和Threadpool则是多线程编程. 但是Task也是把任务推到线程池中 1 static void Main(string[] args) 2 {

Thread多线程速查手册

常用概念线程安全停止线程守护线程多线程通讯锁Synchornized悲观锁乐观锁共享锁/独占锁读写锁的机制死锁LockReentrantLockConditionCountDownLatchCyclicBarrier信号量SemaphoreThreadLocal高并发线程安全与不安全的类不安全的spring与多线程线程池介绍线程池的优点线程池工作过程常用方法基本使用阻塞队列 toc 常用概念 线程状态 新建状态.就绪状态.运行状态.阻塞状态及死亡状态. 新建状态: 当用new操作符创建一个线程时

python thread 多线程

thread 模块在python3中改为_thread,网上的各种帖子都说不建议新手使用thread,好吃不好吃总得尝尝看. 1 import _thread 2 3 def print_num(): 4 for i in range(100): 5 print(i) 6 7 _thread.start_new_thread(print_num,()) 8 _thread.start_new_thread(print_num,()) 9 _thread.start_new_thread(prin

不用线程池,使用Semaphore信号量同样也可以控制Thread多线程的并行数量。

static Semaphore sem = new Semaphore(100, 100); for (int i = 0; i <1000; i++) { Thread td = new Thread(new ParameterizedThreadStart(方法)); td.Start(i); } static void 方法(object i) { sem.WaitOne();//自减信号量 方法体... 执行完成.... sem.Release();//信号量自增 }

Java Thread 多线程 介绍

1.线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程. 当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 2.线程和进程 几乎所有的操作系统都有进程的概念,所有运行中的任务通常对应一条进程.当一个程序进入内存运行,就是一个进程了. 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自

java多线程中synchronize锁的使用和学习,Thread多线程学习(二)

synchronize我的理解是为了保证程序中的原子性和一致性,即当你有两个线程同时操作一段代码的时候,要让这段代码的执行是在任何状态下都是正确的,首先要保证synchronize的使用要对同一个对象和同一把锁使用. [java] view plain copy print? <span style="font-size:14px;">public class TraditionalThreadSynchronized { public static void main(S