一、多进程

1.子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

2.multiprocessing

multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束

 1 import os,time,random
 2 from multiprocessing import Process
 3 #运行多个子进程
 4 def run_child_process(name):
 5     print("run child process %s(%s)"%(name,os.getpid()))
 6
 7 if __name__=='__main__':
 8     print("parent process %s"%os.getpid())
 9     p1=Process(target=run_child_process,args=("p1",))
10     p1.start()
11     p1.join()
12     print("child process end")

3.进程池 pool

如果要启动大量的子进程,可以用进程池的方式批量创建子进程:

 1 from multiprocessing import Pool
 2 import os,time,random
 3 def long_time_task(name):
 4     print("run task %s(%s)"%(name,os.getpid()))
 5     start=time.time()
 6     time.sleep(random.random()*3)
 7     end=time.time()
 8     print("task %s takes %0.2f seconds"%(name,(end-start)))
 9
10 if __name__=='__main__':
11     print("parent process %s"%os.getpid())
12     p=Pool(4)       #pool的默认值是cpu数
13     for i in range(5):
14         p.apply_async(long_time_task,args=(i,))
15     print("waiting for all subprocess done")
16     p.close()
17     p.join()
18     print("all subprocess done")

执行结果:

Parent process 4984.
Waiting for all subprocesses done...
Run task 3 (9496)...
Task 3 runs 1.65 seconds.
Run task 4 (9496)...
Task 4 runs 0.16 seconds.
Run task 0 (11036)...
Task 0 runs 2.25 seconds.
Run task 2 (8680)...
Task 2 runs 2.67 seconds.
Run task 1 (11100)...
Task 1 runs 2.97 seconds.
All subprocesses done.
[Finished in 3.7s]

二、多线程

多任务可以由多进程完成,也可以由一个进程内的多线程完成。

我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程

1.启动线程

 1 import threading,time
 2 def loop():
 3     print("thread %s is running..."%threading.current_thread().name)
 4     n=0
 5     while n<5:
 6         n=n+1
 7         print("thread %s>>>%s"%(threading.current_thread().name,n))
 8         time.sleep(1)
 9     print("thread %s is ended"%threading.current_thread().name)
10 print("thread %s is running"%threading.current_thread().name)
11 t=threading.Thread(target=loop,name="loopthread")
12 t.start()
13 t.join()
14 print("thread %s is ended"%threading.current_thread().name)

执行结果:

 1 thread MainThread is running
 2 thread loopthread is running...
 3 thread loopthread>>>1
 4 thread loopthread>>>2
 5 thread loopthread>>>3
 6 thread loopthread>>>4
 7 thread loopthread>>>5
 8 thread loopthread is ended
 9 thread MainThread is ended
10 [Finished in 5.3s]

2.lock

多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了

 1 import time,threading
 2 balance=0
 3 lock=threading.Lock()
 4 def change_it(n):
 5     global balance
 6     balance=balance+n
 7     balance=balance-n
 8
 9 def run_thread(n):
10     for i in range(100000):
11         lock.acquire()
12         try:
13             change_it(n)
14         finally:
15             lock.release()
16 t1=threading.Thread(target=run_thread,args=(5,))
17 t2=threading.Thread(target=run_thread,args=(8,))
18 t1.start()
19 t2.start()
20 t1.join()
21 t1.join()
22 print(balance)

三、队列

1.Process之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。Python的multiprocessing模块包装了底层的机制,提供了QueuePipes等多种方式来交换数据。

我们以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

 1 from multiprocessing import Process, Queue
 2 import os, time, random
 3 # 写数据进程执行的代码:
 4 def write(q):
 5     print('Process to write: %s' % os.getpid())
 6     for value in ['A', 'B', 'C']:
 7         print('Put %s to queue...' % value)
 8         q.put(value)
 9     time.sleep(random.random())
10
11 # 读数据进程执行的代码:
12 def read(q):
13     print('Process to read: %s' % os.getpid())
14     while True:
15         value = q.get(True)
16         print('Get %s from queue.' % value)
17
18 if __name__=='__main__':
19     # 父进程创建Queue,并传给各个子进程:
20     q = Queue()
21     pw = Process(target=write, args=(q,))
22     pr = Process(target=read, args=(q,))
23     # 启动子进程pw,写入:
24     pw.start()
25     # 启动子进程pr,读取:
26     pr.start()
27     # 等待pw结束:
28     pw.join()
29     # pr进程里是死循环,无法等待其结束,只能强行终止:
30     pr.terminate()

原文地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431927781401bb47ccf187b24c3b955157bb12c5882d000

https://yuedu.baidu.com/ebook/0f6a093b7dd184254b35eefdc8d376eeaeaa17e3?pn=1&rf=https%3A%2F%2Fyuedu.baidu.com%2Febook%2F0f6a093b7dd184254b35eefdc8d376eeaeaa17e3

转载于:https://www.cnblogs.com/dhs94/p/9005336.html

【python】多进程、多线程、序列相关推荐

  1. python多进程多线程,多个程序同时运行

    python 多线程 多进程同时运行 多任务要求 python 基础语法 python 文件目录操作 python 模块应用 开发工具 pycharm 实现方法 多任务的实现可以用进程和线程来实现 进 ...

  2. python多进程、多线程

    1.python多线程 使用一个例子来学习多线程.建议自己敲一遍. python多线程是通过threading模块的Thread实现. 创建线程对象 t = thread.Thread() 启动线程 ...

  3. Python 多进程开发与多线程开发

    我们先来了解什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...

  4. python 多进程_说说Python多线程与多进程的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  5. 一文看懂Python多进程与多线程编程(工作学习面试必读)

    进程(process)和线程(thread)是非常抽象的概念, 也是程序员必需掌握的核心知识.多进程和多线程编程对于代码的并发执行,提升代码效率和缩短运行时间至关重要.小编我今天就来尝试下用一文总结下 ...

  6. python 多进程和多线程

    python 多进程和多线程 一.进程和线程 1.概念 进程: 一个进程就是一个任务,可以理解为一个程序.一个进程可以有多个线程,至少一个.多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影 ...

  7. Python实现多进程/多线程同时下载单个文件

    功能描述: 使用多进程/多线程同时下载单个文件,可以自定义文件地址.进程/线程数量. 主要思路: 获取文件大小,使用多个进程/线程分别下载一部分,最后再把这些文件拼接起来. 参考代码: 运行结果: - ...

  8. python随笔系列--多进程多线程并发度初探

    大家都知道python中由于GIL这把大锁的存在,导致python的多线程并不是真正的多线程(不同于java等语言).首先了解下GIL导致的现象:同一时间只能有一个线程占有python解释器(或者,同 ...

  9. 关于python的多线程和多进程_Python的多线程和多进程

    (1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...

  10. 【干货】python多进程和多线程谁更快

    python多进程和多线程谁更快 python3.6 threading和multiprocessing 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为G ...

最新文章

  1. Elasticsearch增删改查
  2. Cisco3750在多VLAN网络环境下DHCP的实现
  3. strapi 开源api 内容管理平台试用
  4. 46. Ext中namespace的作用(转)
  5. python线程与进程视频教程_[PYTHON系列教程]→进程 vs. 线程
  6. sql的limit用法
  7. 【复杂系统迁移 .NET Core平台系列】之调度服务改造
  8. 10万辅导老师困境:上半年被抢,下半年被裁
  9. 201621123053《Java程序设计》第十一周学习笔记文章
  10. 如何退出while(cinvalue)的循环
  11. 【8.16校内测试】【队列】【数学】【网络流/二分图最大匹配】
  12. SpringBoot高级篇-属性配置
  13. matlab许可证_MATLAB校园许可证更新指南
  14. 浅谈个人对读书的看法
  15. 人脸特征点定位方法DEST, 基于VS2019+OpenCV3.4.6
  16. 台风怎么看内存颗粒_光威TYPE普通马甲内存条,南亚ADIE HR颗粒稳超3200MHZ
  17. python安装requirement.txt的扩展包
  18. Redis Geospatial地理位置
  19. Fan996餐饮外卖平台小程序 V1.0.1正式版
  20. Binggo公开课 “CODEX创新体系”的实战演练-中关村创业大街

热门文章

  1. 在Idea2017.1中编译时发生如下的错误
  2. 一个存储交流的报告——闪存存储系统设计
  3. Jabber 创建一个application dial rule
  4. Android Screen Orientation
  5. contentType,charset和pageEncoding的区别
  6. mysql强制编码导出、导入数据
  7. 详析Exchange 2007/2010 SSL证书如何安装
  8. 我的 WinClock 项目系列之一 (概述)
  9. 【Vegas2006】8月11日-咖啡生活
  10. (其他)用sublime text3编写的html网页用浏览器打开出现中文乱码的原理及解决方法(转)...