首页 > 编程 > Python > 正文

对于Python中线程问题的简单讲解

2020-02-23 00:32:11
字体:
来源:转载
供稿:网友

我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争。你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果。声明:从这里开始忘掉你听到过的关于GIL的东西,因为GIL不会影响到我想要展示的东西。

示例1

我们将要请求五个不同的url:
单线程
 

import timeimport urllib2 def get_responses(): urls = [  'http://www.google.com',  'http://www.amazon.com',  'http://www.ebay.com',  'http://www.alibaba.com',  'http://www.reddit.com' ] start = time.time() for url in urls:  print url  resp = urllib2.urlopen(url)  print resp.getcode() print "Elapsed time: %s" % (time.time()-start) get_responses()

输出是:
 

http://www.google.com 200http://www.amazon.com 200http://www.ebay.com 200http://www.alibaba.com 200http://www.reddit.com 200Elapsed time: 3.0814409256

解释:

    url顺序的被请求     除非cpu从一个url获得了回应,否则不会去请求下一个url     网络请求会花费较长的时间,所以cpu在等待网络请求的返回时间内一直处于闲置状态。

多线程
 

import urllib2import timefrom threading import Thread class GetUrlThread(Thread): def __init__(self, url):  self.url = url  super(GetUrlThread, self).__init__()  def run(self):  resp = urllib2.urlopen(self.url)  print self.url, resp.getcode() def get_responses(): urls = [  'http://www.google.com',  'http://www.amazon.com',  'http://www.ebay.com',  'http://www.alibaba.com',  'http://www.reddit.com' ] start = time.time() threads = [] for url in urls:  t = GetUrlThread(url)  threads.append(t)  t.start() for t in threads:  t.join() print "Elapsed time: %s" % (time.time()-start) get_responses()

输出:
 

http://www.reddit.com 200http://www.google.com 200http://www.amazon.com 200http://www.alibaba.com 200http://www.ebay.com 200Elapsed time: 0.689890861511

解释:

    意识到了程序在执行时间上的提升     我们写了一个多线程程序来减少cpu的等待时间,当我们在等待一个线程内的网络请求返回时,这时cpu可以切换到其他线程去进行其他线程内的网络请求。     我们期望一个线程处理一个url,所以实例化线程类的时候我们传了一个url。     线程运行意味着执行类里的run()方法。     无论如何我们想每个线程必须执行run()。     为每个url创建一个线程并且调用start()方法,这告诉了cpu可以执行线程中的run()方法了。     我们希望所有的线程执行完毕的时候再计算花费的时间,所以调用了join()方法。     join()可以通知主线程等待这个线程结束后,才可以执行下一条指令。     每个线程我们都调用了join()方法,所以我们是在所有线程执行完毕后计算的运行时间。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表