我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争。你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果。声明:从这里开始忘掉你听到过的关于GIL的东西,因为GIL不会影响到我想要展示的东西。
示例1
我们将要请求五个不同的url:
12345678910111213141516171819 | 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() |
输出是:
123456 | http://www.google.com 200http://www.amazon.com 200http://www.ebay.com 200http://www.alibaba.com 200http://www.reddit.com 200Elapsed time: 3.0814409256 |
解释:
1234567891011121314151617181920212223242526272829303132 | 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() |
输出:
ܚ看到一些在Python中使用线程的实例和如何避免线程之间的竞争。你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果。声明:从这里开始忘掉你听到过的关于GIL的东西,因为GIL不会影响到我想要展示的东西。
示例1 我们将要请求五个不同的url: 单线程
输出是:
解释:
多线程
输出:
|