摘要:,,等实用方法可以获取一个队列的当前大小和状态。但要注意,这些方法都不是线程安全的。可能你对一个队列使用判断出这个队列为空,但同时另外一个线程可能已经向这个队列中插入一个数据项。
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()
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 进行并发编程 - asyncio 篇 (三) - 掘金 这是「使用Python进行并发编程」系列的最后一篇。我特意地把它安排在了16年最后一天。 重新实验上篇的效率对比的实现 在第一篇我们曾经对比并发执行的效率,但是请求的是httpb...
摘要:本文最先发布在博客这篇文章将讲解并发编程的基本操作。并发是指能够多任务处理,并行则是是能够同时多任务处理。虽然自带了很好的类库支持多线程进程编程,但众所周知,因为的存在,很难做好真正的并行。 本文最先发布在博客:https://blog.ihypo.net/151628... 这篇文章将讲解 Python 并发编程的基本操作。并发和并行是对孪生兄弟,概念经常混淆。并发是指能够多任务处...
摘要:扩展支持多用户并发访问与线程池。项目请见初学网络编程之服务器。不允许超过磁盘配额。该文件是一个使用模块编写的线程池类。这一步就做到了线程池的作用。 对MYFTP项目进行升级。扩展支持多用户并发访问与线程池。MYFTP项目请见python初学——网络编程之FTP服务器。 扩展需求 1.在之前开发的FTP基础上,开发支持多并发的功能2.不能使用SocketServer模块,必须自己实现多线...
摘要:也提供多线程支持,而且中的线程并非是模拟出来的多线程,而是系统级别的标准库提供了两个模块和。同一个变量,线程则会互相共享。例如多个线程对银行中的某一个账户进行操作。但是实际情况是随意切换线程。说到的多线程编程,就会绕不过。 该文章参考了http://www.liaoxuefeng.com/wi... 廖雪峰的教程。 一个进程至少有一个线程。Python也提供多线程支持,而且Python...
阅读 785·2021-08-23 09:46
阅读 927·2019-08-30 15:44
阅读 2585·2019-08-30 13:53
阅读 3038·2019-08-29 12:48
阅读 3846·2019-08-26 13:46
阅读 1779·2019-08-26 13:36
阅读 3508·2019-08-26 11:46
阅读 1407·2019-08-26 10:48