当前位置: 首页 > news >正文

python多线程编程

Python多线程编程中常用方法:

1、join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join([timeout]) timeout:可选参数,线程运行的最长时间

2、isAlive()方法:查看线程是否还在运行

3、getName()方法:获得线程名

4、setDaemon()方法:主线程退出时,需要子线程随主线程退出,则设置子线程的setDaemon()

Python线程同步:

(1)Thread的Lock和RLock实现简单的线程同步:

import threading
import time
class mythread(threading.Thread):def __init__(self,threadname):threading.Thread.__init__(self,name=threadname)def run(self):global xlock.acquire()for i in range(3):x = x+1time.sleep(1)print xlock.release()if __name__ == '__main__':lock = threading.RLock()t1 = []for i in range(10):t = mythread(str(i))t1.append(t)x = 0for i in t1:i.start()

(2)使用条件变量保持线程同步:

# coding=utf-8
import threadingclass Producer(threading.Thread):def __init__(self,threadname):threading.Thread.__init__(self,name=threadname)def run(self):global xcon.acquire()if x == 10000:con.wait() passelse:for i in range(10000):x = x+1con.notify()print xcon.release()class Consumer(threading.Thread):def __init__(self,threadname):threading.Thread.__init__(self,name=threadname)def run(self):global xcon.acquire()if x == 0:con.wait()passelse:for i in range(10000):x = x-1con.notify()print xcon.release()if __name__ == '__main__':con = threading.Condition()x = 0p = Producer('Producer')c = Consumer('Consumer')p.start()c.start()p.join()c.join()print x

(3)使用队列保持线程同步:

# coding=utf-8
import threading
import Queue
import time
import randomclass Producer(threading.Thread):def __init__(self,threadname):threading.Thread.__init__(self,name=threadname)def run(self):global     queuei = random.randint(1,5)queue.put(i)print self.getName(),' put %d to queue' %(i)time.sleep(1)class Consumer(threading.Thread):def __init__(self,threadname):threading.Thread.__init__(self,name=threadname)def run(self):global     queueitem = queue.get()print self.getName(),' get %d from queue' %(item)time.sleep(1)if __name__ == '__main__':queue = Queue.Queue()plist = []clist = []for i in range(3):p = Producer('Producer'+str(i))plist.append(p)for j in range(3):c = Consumer('Consumer'+str(j))clist.append(c)for pt in plist:pt.start()pt.join()for ct in clist:ct.start()ct.join()

生产者消费者模式的另一种实现:

# coding=utf-8
import time
import threading
import Queueclass Consumer(threading.Thread):def __init__(self, queue):threading.Thread.__init__(self)self._queue = queuedef run(self):while True:# queue.get() blocks the current thread until an item is retrieved.msg = self._queue.get()# Checks if the current message is the "quit"if isinstance(msg, str) and msg == 'quit':# if so, exists the loopbreak# "Processes" (or in our case, prints) the queue itemprint "I'm a thread, and I received %s!!" % msg# Always be friendly!print 'Bye byes!'class Producer(threading.Thread):def __init__(self, queue):threading.Thread.__init__(self)self._queue = queuedef run(self):# variable to keep track of when we startedstart_time = time.time()# While under 5 seconds..while time.time() - start_time < 5:# "Produce" a piece of work and stick it in the queue for the Consumer to processself._queue.put('something at %s' % time.time())# Sleep a bit just to avoid an absurd number of messagestime.sleep(1)# This the "quit" message of killing a thread.self._queue.put('quit')if __name__ == '__main__':queue = Queue.Queue()consumer = Consumer(queue)consumer.start()producer1 = Producer(queue)producer1.start()

使用线程池(Thread pool)+同步队列(Queue)的实现方式:

# A more realistic thread pool example
# coding=utf-8
import time 
import threading 
import Queue 
import urllib2 class Consumer(threading.Thread): def __init__(self, queue):threading.Thread.__init__(self)self._queue = queue def run(self):while True: content = self._queue.get() if isinstance(content, str) and content == 'quit':breakresponse = urllib2.urlopen(content)print 'Bye byes!'def Producer():urls = ['http://www.python.org', 'http://www.yahoo.com''http://www.scala.org', 'http://cn.bing.com'# etc.. ]queue = Queue.Queue()worker_threads = build_worker_pool(queue, 4)start_time = time.time()# Add the urls to processfor url in urls: queue.put(url)  # Add the 'quit' messagefor worker in worker_threads:queue.put('quit')for worker in worker_threads:worker.join()print 'Done! Time taken: {}'.format(time.time() - start_time)def build_worker_pool(queue, size):workers = []for _ in range(size):worker = Consumer(queue)worker.start() workers.append(worker)return workersif __name__ == '__main__':Producer()

另一个使用线程池+Map的实现:

import urllib2 
from multiprocessing.dummy import Pool as ThreadPool urls = ['http://www.python.org', 'http://www.python.org/about/','http://www.python.org/doc/','http://www.python.org/download/','http://www.python.org/community/']# Make the Pool of workers
pool = ThreadPool(4) 
# Open the urls in their own threads
# and return the results
results = pool.map(urllib2.urlopen, urls)
#close the pool and wait for the work to finish 
pool.close() 
pool.join()

http://www.lryc.cn/news/16500.html

相关文章:

  • 小熊电器:精品与创意,走上“顶流之路”的两把“宝剑”
  • 如何描述元素与元素间的逻辑关系?
  • 【3】linux命令每日分享——mv改名或移动
  • 【2023最火教程】Python性能测试框架Locust实战教程(建议收藏)
  • 深入浅出C++ ——手撕AVL树
  • 将多个springboot项目的pom.xml文件整合
  • 【Unity实战100例】Unity串口通讯的消息接收解析和发送指令
  • 资源消耗降低 90%,速度提升 50%,解读 Apache Doris Compaction 最新优化与实现
  • 【Mysql】 锁
  • Android 流量统计
  • 如何保证数据的安全?对称和非对称加密,身份认证,摘要算法,数字证书等傻傻分不清?波哥图解带你彻底掌握
  • 计算机网络概述
  • 小学生学Arduino---------点阵(二)动态图片以及文字
  • 【C语言】-程序编译的环境和预处理详解-让你轻松理解程序是怎么运行的!!
  • MapBox动态气泡图渲染教程
  • 在 Ubuntu18.04 上编译安装 GMP
  • 到底什么样的条件才能被浙大MBA录取?攻略集合
  • Impacket工具使用
  • 华为OD机试真题Python实现【RSA 加密算法】真题+解题思路+代码(20222023)
  • App.vue中读取不到路由的信息
  • Lambda表达式详解
  • 网关的通用设计框架
  • API 接口应该如何设计?如何保证安全?如何签名?如何防重?
  • LeetCode-131. 分割回文串
  • 【C++】string类的基本使用
  • 【第一章 - 绪论】- 数据结构(近八千字详解)
  • QIfw制作软件安装程序
  • 【C++】C++入门(上)
  • 5. Kimball维度建模常用术语及概念(一)
  • 内核调试之Panic-Oops日志分析