• 技术文章 >后端开发 >Python教程

    总结python中的线程与协程

    零下一度零下一度2017-06-16 10:29:11原创517
    下面小编就为大家带来一篇python简单线程和协程学习心得(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    python中对线程的支持的确不够,不过据说python有足够完备的异步网络框架模块,希望日后能学习到,这里就简单的对python中的线程做个总结

    threading库可用来在单独的线程中执行任意的python可调用对象。尽管此模块对线程相关操作的支持不够,但是我们还是能够用简单的线程来处理I/O操作,以减低程序响应时间。

    from threading import Thread
    import time
     
     
    def countdown(n):
      while n > 0:
        print('T-minus:', n)
        n -= 1
     
     
    t = Thread(target=countdown, args=(10,))
    t.start() # 开启线程
     
    time.sleep(2)
     
    if t.is_alive() is True:
      print("停止线程...")
      t._stop() # 停止线程

    start函数是用来开启线程的,_stop函数是用来停止线程的。为了防止在线程中进行I/O操作时出现阻塞等问题,运行一段时间之后,可以判断线程是否还存活,如果线程还存在就调用_stop()停止,防止阻塞(你可以将_stop函数封装到类中,我这里并没有这么做)。

    当然,你可以调用ThreadPool线程池来处理,而不是手动创建线程。如果线程间不需要共享变量的话,使用线程还是很方便的,可以减少很多的麻烦操作以及省时。如果需要在线程间进行通信,我们可以使用队列来实现:

    from queue import Queue
    from threading import Thread
     
     
    class kill:
      def terminate(self, t):
        if t.isAlive is True:
          t._stop()
     
     
    def product(out_q):
      for i in range(5):
          out_q.put(i)
     
     
    def consumer(in_q):
      for i in range(5):
        print(in_q.get())
     
     
    q = Queue()
    t1 = Thread(target=consumer, args=(q,))
    t2 = Thread(target=product, args=(q,))
    t1.start()
    t2.start()
     
     
    k = kill() # 查询线程是否终止,防止阻塞...
    k.terminate(t1)
    k.terminate(t2)

    Queue实例会被所有的线程共享,同时它又拥有了所有所需要的锁,因此它们可以安全的在任意多的线程中共享。在这里要注意,不要再多线程中使用除了put(),get()方法之外的queue类的方法,因为在多线程环境中这是不可靠的!对于简单的小型的线程中数据的通信,可以使用队列来处理。如果是大型的数据需要交互通信,python提供了相关的模块你可以使用,具体的u need baidu.

    所谓协程,其实就是在单线程的环境下的yield程序。


    from collections import deque
     
     
    def countdown(n):
      while n > 0:
        print("T-minus", n)
        yield # 返回之后下次直接从这里执行...相当于C#里面得yield return .
        n -= 1
      print("this is countdown!!!")
     
     
    def countup(n):
      x = 0
      while x < n:
        print("Counting up", x)
        yield
        x += 1
     
     
    class TaskScheduler:
      def init(self):
        self._task_queue = deque()
     
      def new_task(self, task):
        self._task_queue.append(task)
     
      def run(self):
        while self._task_queue:
          task = self._task_queue.popleft()
          try:
            next(task)
            self._task_queue.append(task)
          except StopIteration:
            pass
     
     
    sche = TaskScheduler()
    sche.new_task(countdown(10))
    sche.new_task(countdown(5))
    sche.new_task(countup(15))
    sche.run()

    在这里说下自己这段时间使用python的心得,python的确不错,但性能也是为人诟病,一开始学习python,我也是去做一些比较炫的程序,最起码听起来逼格高,比如使用python的自然语言处理来做情感分析以及最热的爬虫程序,还有做炫的数据分析图表。渐渐地,我就放下了那些,因为程序的重点不在那些,只要你会点基本的语法,看得懂官方文档就能够做出来,而程序代码的重点在性能,优化。最大程度的写出功能最完善,性能最优,结构最优美的程序,其实这就有点像是政治老师常说的"文化软实力",程序中的"软实力"应该是在程序中嵌入最适合的设计模式,做最完备的程序优化,采用最省性能的数据结构等。

    以上就是总结python中的线程与协程的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:python 协程 线程
    上一篇:分享一篇用Python刷浏览量的实例教程 下一篇:Python字符串处理实例详解
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 一起聊聊python程序设计思想• Python图像处理之PIL库• 深入了解Python装饰器函数• python数据可视化之饼状图的绘制• Python实例详解pdfplumber读取PDF写入Excel
    1/1

    PHP中文网