理解Python中的线程

499 查看

我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争。

你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果。

声明:从这里开始忘掉你听到过的关于GIL的东西,因为GIL不会影响到我想要展示的东西。

示例1:

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

单线程

输出是:

解释:

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

输出:

解释:

  • 意识到了程序在执行时间上的提升
  • 我们写了一个多线程程序来减少cpu的等待时间,当我们在等待一个线程内的网络请求返回时,这时cpu可以切换到其他线程去进行其他线程内的网络请求。
  • 我们期望一个线程处理一个url,所以实例化线程类的时候我们传了一个url。
  • 线程运行意味着执行类里的run()方法。
  • 无论如何我们想每个线程必须执行run()
  • 为每个url创建一个线程并且调用start()方法,这告诉了cpu可以执行线程中的run()方法了。
  • 我们希望所有的线程执行完毕的时候再计算花费的时间,所以调用了join()方法。 ݱ响到我想要展示的东西。

    示例1:

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

    单线程

    输出是:

    解释:

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

    输出:

    解释:

    • 意识到了程序在执行时间上的提升
    • 我们写了一个多线程程序来减少cpu的等待时间,当我们在等待一个线程内的网络请求返回时,这时cpu可以切换到其他线程去进行其他线程内的网络请求。
    • 我们期望一个线程处理一个url,所以实例化线程类的时候我们传了一个url。
    • 线程运行意味着执行类里的run()方法。
    • 无论如何我们想每个线程必须执行run()
    • 为每个url创建一个线程并且调用start()方法,这告诉了cpu可以执行线程中的run()方法了。
    • 我们希望所有的线程执行完毕的时候再计算花费的时间,所以调用了join()方法。 v>