python高级线程、进程和进程池
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python高级线程、进程和进程池,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3227字,纯文字阅读大概需要5分钟。
内容图文
![python高级线程、进程和进程池](/upload/InfoBanner/zyjiaocheng/932/2095e624feea458892db24cd379bf72f.jpg)
import threading # 这个函数名可随便定义 def run(n): print("current task:", n) if __name__ == "__main__": t1 = threading.Thread(target=run, args=("thread 1",)) t2 = threading.Thread(target=run, args=("thread 2",)) t1.start() t2.start()方法2:继承threading.Thread来自定义线程类,重写run方法
import threading class MyThread(threading.Thread): def __init__(self, n): super(MyThread, self).__init__() # 重构run函数必须要写 self.n = n def run(self): print("current task:", self.n) if __name__ == "__main__": t1 = MyThread("thread 1") t2 = MyThread("thread 2") t1.start() t2.start()
二、创建多进程
Python 要进行多进程操作,需要用到muiltprocessing库,其中的Process类跟threading模块的Thread类很相似。所以直接看代码熟悉多进程。 方法1:直接使用Process, 代码如下:from multiprocessing import Process def show(name): print("Process name is " + name) if __name__ == "__main__": proc = Process(target=show, args=('subprocess',)) proc.start() proc.join()方法2:继承Process来自定义进程类,重写run方法, 代码如下:
from multiprocessing import Process import time class MyProcess(Process): def __init__(self, name): super(MyProcess, self).__init__() self.name = name def run(self): print('process name :' + self.name) time.sleep(1) if __name__ == '__main__': for i in range(3): p = MyProcess(str(i)) p.start() for i in range(3): p.join()多进程通信 进程之间不共享数据的。如果进程之间需要进行通信,则要用到Queue模块或者Pipi模块来实现。 Queue Queue 是多进程安全的队列,可以实现多进程之间的数据传递。它主要有两个函数,put和get。 put() 用以插入数据到队列中,put 还有两个可选参数:blocked 和 timeout。如果 blocked 为 True(默认值),并且 timeout 为正值,该方法会阻塞 timeout 指定的时间,直到该队列有剩余的空间。如果超时,会抛出 Queue.Full 异常。如果 blocked 为 False,但该 Queue 已满,会立即抛出 Queue.Full 异常。 get()可以从队列读取并且删除一个元素。同样,get 有两个可选参数:blocked 和 timeout。如果 blocked 为 True(默认值),并且 timeout 为正值,那么在等待时间内没有取到任何元素,会抛出 Queue.Empty 异常。如果blocked 为 False,有两种情况存在,如果 Queue 有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出 Queue.Empty 异常。 具体用法如下:
from multiprocessing import Process, Queue def put(queue): queue.put('Queue 用法') if __name__ == '__main__': queue = Queue() pro = Process(target=put, args=(queue,)) pro.start() print(queue.get()) pro.join()
三、进程池 创建多个进程,我们不用傻傻地一个个去创建。我们可以使用Pool模块来搞定。 Pool 常用的方法如下: 方法 含义 apply() 同步执行(串行) apply_async() 异步执行(并行) terminate() 立刻关闭进程池 join() 主进程等待所有子进程执行完毕。必须在close或terminate()之后使用 close() 等待所有进程结束后,才关闭进程池 ? 具体用法见示例代码:
from multiprocessing import Pool def show(num): print('num : ' + str(num)) if __name__=="__main__": pool = Pool(processes = 3) for i in range(6): # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去 pool.apply_async(show, args=(i, )) print('====== apply_async ======') pool.close() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束 pool.join()
? ? ? ? ? ? ? ? ? ? ? ?
内容总结
以上是互联网集市为您收集整理的python高级线程、进程和进程池全部内容,希望文章能够帮你解决python高级线程、进程和进程池所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。