资讯专栏INFORMATION COLUMN

python 多线程编程

dreamGong / 2431人阅读

摘要:,,等实用方法可以获取一个队列的当前大小和状态。但要注意,这些方法都不是线程安全的。可能你对一个队列使用判断出这个队列为空,但同时另外一个线程可能已经向这个队列中插入一个数据项。

python 多线程编程 使用回调方式
import time
def countdown(n):
    while n > 0:
        print("T-minus", n)
        n -= 1
        time.sleep(5)

# Create and launch a thread
from threading import Thread
t = Thread(target=countdown, args=(10,))
t.start()
把线程放入一个类
from threading import Thread

class CountdownTask:
    def __init__(self):
        self._running = True

    def terminate(self):
        self._running = False

    def run(self, n):
        while self._running and n > 0:
            print("T-minus", n)
            n -= 1
            time.sleep(5)

c = CountdownTask()
t = Thread(target=c.run, args=(10,))
t.start()
c.terminate() # Signal termination
t.join()      # Wait for actual termination (if needed)

注意使用变量 self._running 退出线程的方式

使用继承方式

from threading import Thread

class CountdownThread(Thread):

def __init__(self, n):
    super().__init__()
    self.n = n
def run(self):
    while self.n > 0:

        print("T-minus", self.n)
        self.n -= 1
        time.sleep(5)

c = CountdownThread(5)
c.start()

使用 Queue 进行线程间通信
import Queue
import threading
import time

task_queue = Queue.Queue()


class ThreadTest(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while True:
            msg = self.queue.get()
            print(msg)
            time.sleep(0.1)
            self.queue.task_done()


def main():
    start = time.time()
    # populate queue with data
    for i in range(100):
        task_queue.put("message")

    # spawn a pool of threads, and pass them queue instance
    for i in range(5):
        t = ThreadTest(task_queue)
        t.setDaemon(True)
        t.start()

    # wait on the queue until everything has been processed
    task_queue.join()
    print "Elapsed Time: {}".format(time.time() - start)


if __name__ == "__main__":
    main()

setDaemon 设置为 True, run 函数中不需要退出,主线程结束后所有子线程退出
如果 setDaemon 设置为 False,则改为

def run(self):
    while not self.queue.empty():
        msg = self.queue.get()
        print(msg)
        time.sleep(0.1)
        self.queue.task_done()

并且在主函数结束前 join 所有线程

注意

向队列中添加数据项时并不会复制此数据项,线程间通信实际上是在线程间传递对象引用。如果你担心对象的共享状态,那你最好只传递不可修改的数据结构(如:整型、字符串或者元组)或者一个对象的深拷贝。

  from queue import Queue
  from threading import Thread
  import copy

  # A thread that produces data
  def producer(out_q):
      while True:
          # Produce some data
          ...
          out_q.put(copy.deepcopy(data))

  # A thread that consumes data
  def consumer(in_q):
      while True:
          # Get some data
          data = in_q.get()
          # Process the data
          ...

q.qsize() , q.full() , q.empty() 等实用方法可以获取一个队列的当前大小和状态。但要注意,这些方法都不是线程安全的。可能你对一个队列使用 empty() 判断出这个队列为空,但同时另外一个线程可能已经向这个队列中插入一个数据项。

参考

python3-cookbook Chapter 12 "Concurrency-Starting and Stopping Threads"

Practical threaded programming with Python

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45007.html

相关文章

  • 使用 Python 进行并发编程系列 - 收藏集 - 掘金

    摘要:使用进行并发编程篇三掘金这是使用进行并发编程系列的最后一篇。所以我考虑启用一个本地使用进行并发编程篇二掘金我们今天继续深入学习。 使用 Python 进行并发编程 - asyncio 篇 (三) - 掘金 这是「使用Python进行并发编程」系列的最后一篇。我特意地把它安排在了16年最后一天。 重新实验上篇的效率对比的实现 在第一篇我们曾经对比并发执行的效率,但是请求的是httpb...

    MorePainMoreGain 评论0 收藏0
  • Python

    摘要:最近看前端都展开了几场而我大知乎最热语言还没有相关。有关书籍的介绍,大部分截取自是官方介绍。但从开始,标准库为我们提供了模块,它提供了和两个类,实现了对和的进一步抽象,对编写线程池进程池提供了直接的支持。 《流畅的python》阅读笔记 《流畅的python》是一本适合python进阶的书, 里面介绍的基本都是高级的python用法. 对于初学python的人来说, 基础大概也就够用了...

    dailybird 评论0 收藏0
  • Python 的并发编程

    摘要:本文最先发布在博客这篇文章将讲解并发编程的基本操作。并发是指能够多任务处理,并行则是是能够同时多任务处理。虽然自带了很好的类库支持多线程进程编程,但众所周知,因为的存在,很难做好真正的并行。 本文最先发布在博客:https://blog.ihypo.net/151628... 这篇文章将讲解 Python 并发编程的基本操作。并发和并行是对孪生兄弟,概念经常混淆。并发是指能够多任务处...

    happen 评论0 收藏0
  • python初学——网络编程之FTP服务器支持并发版本

    摘要:扩展支持多用户并发访问与线程池。项目请见初学网络编程之服务器。不允许超过磁盘配额。该文件是一个使用模块编写的线程池类。这一步就做到了线程池的作用。 对MYFTP项目进行升级。扩展支持多用户并发访问与线程池。MYFTP项目请见python初学——网络编程之FTP服务器。 扩展需求 1.在之前开发的FTP基础上,开发支持多并发的功能2.不能使用SocketServer模块,必须自己实现多线...

    oysun 评论0 收藏0
  • python学习笔记- 线程

    摘要:也提供多线程支持,而且中的线程并非是模拟出来的多线程,而是系统级别的标准库提供了两个模块和。同一个变量,线程则会互相共享。例如多个线程对银行中的某一个账户进行操作。但是实际情况是随意切换线程。说到的多线程编程,就会绕不过。 该文章参考了http://www.liaoxuefeng.com/wi... 廖雪峰的教程。 一个进程至少有一个线程。Python也提供多线程支持,而且Python...

    RiverLi 评论0 收藏0

发表评论

0条评论

dreamGong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<