一、多线程

1、顺序执行单个线程,注意要顺序执行的话,需要用join。

 #coding=utf-8

 from threading import Thread
import time def my_counter():
i = 0
for _ in range(100000000):
i = i + 1
return True def main():
thread_array = {}
start_time = time.time()
for tid in range(2):
t = Thread(target=my_counter)
t.start()
# join阻塞下个线程,除非当前线程执行完毕
t.join()
end_time = time.time()
print("Total time: {}".format(end_time - start_time)) if __name__ == '__main__':

 执行结果: 

2、同时执行两个并发线程

 #coding=utf-8

 from threading import Thread
import time def prn_obj(obj):
return '\n'.join(['%s:%s' % item for item in obj.__dict__.items()]) def my_counter():
i = 0
for _ in range(100000000):
i = i + 1
return True def main():
thread_array = {}
start_time = time.time()
for tid in range(2):
t = Thread(target=my_counter)
t.start()
thread_array[tid] = t
for i in range(2):
thread_array[i].join()
# print("thread type: {}".format(prn_obj(thread_array[i])))
print("thread type: {}".format(thread_array[i].name))
end_time = time.time()
print("Total time: {}".format(end_time - start_time)) if __name__ == '__main__':
main()

下面是用了打印所有属性的方法,这个方法代码中注释了,可重复利用的代码块

二、多进程

1、multiprocessing

multiprocessing是跨平台版本的多进程模块,它提供了一个Process类来代表一个进程对象,下面是示例嗲吗

import os
if __name__=='__main__':
print 'Process (%s) start...' % os.getpid()
pid = os.fork()
print pid
if pid==0:
print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())
else:
print 'I (%s) just created a child process (%s).' % (os.getpid(), pid)

这个程序如果用单进程写则需要执行10秒以上的时间,而用多进程则启动10个进程并行执行,只需要用1秒多的时间。

在python中建议使用多进程而不是多线程,因为在python的多线程中有个全局解释器锁,这样在做并发效率会不是很高。

进程和进程直接可以用不同的全局解释器锁,可以提高程序效率。

2、进程间通信Queue

进程和进程之前是独立的,如果需要通信就需要Queue创建的对象来处理

 from multiprocessing import Process,Queue
import time def write(q):
for i in ['A','B','C','D','E']:
print('Put %s to queue' % i)
q.put(i)
time.sleep(0.5) def read(q):
while True:
v = q.get(True)
print('get %s form queue' %v) if __name__ == '__main__':
q = Queue()
pw = Process(target=write,args=(q,))
pr = Process(target=read,args=(q,))
pw.start()
pr.start()
pr.join()
pr.terminate()

3、进程池Pool

 #coding=utf-8

 from multiprocessing import Pool
import time def f(x):
print x*x
time.sleep(2)
return x*x if __name__ == '__main__':
'''定义启动的进程数量'''
pool = Pool(processes=5)
res_list = [] for i in range(10):
'''
以异步并行的方式启动进程,如果要同步等待的方式,
可以在每次启动进程之后调用res.get()方法
也可以使用Pool.appley
'''
res = pool.apply_async(f,[i,])
print('--------:',i)
res_list.append(res)
pool.close()
pool.join()
for r in res_list:
print "result",(r.get(timeout=5))

三、多线程与多进程的对比

在一般情况下多个进程的内存资源是相互独立的,而多线程可以共享同一个进程中的内存资源

 #coding=utf-8

 from multiprocessing import Process
import threading
import time
lock = threading.Lock() def run(info_list,n):
lock.acquire()
info_list.append(n)
lock.release()
print('%s' % info_list) if __name__ == '__main__':
info = []
for i in range(10):
# target为子进程执行的函数,args为需要给函数传递的参数
p = Process(target=run,args=[info,i])
p.start()
p.join()
time.sleep(1)#这里为了输出整齐让主进程的执行等一下子进程
print('-------------------threading---------------------')
for i in xrange(1,10):
p = threading.Thread(target=run,args=[info,i])
p.start()
p.join()

Python之多线程和多进程的更多相关文章

  1. Python的多线程和多进程

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

  2. Python【多线程与多进程】

    import time,threading print("=======串行方式.并行两种方式调用run()函数=======")def run(): print('哈哈哈') # ...

  3. python的多线程、多进程代码示例

    python多进程和多线程的区别:python的多线程不是真正意义上的多线程,由于python编译器的问题,导致python的多线程存在一个PIL锁,使得python的多线程的CPU利用率比预期的要低 ...

  4. selenium +python之多线程与多进程应用于自动化测试

    多线程与多进程与自动化测试用例结合起来执行,从而节省测试用例的总体运行时间. 多线程执行测试测试用例 以百度搜索为例,通过不同的浏览器来启动不同的线程. from selenium import we ...

  5. Python之多线程与多进程(二)

    多进程 上一章:Python多线程与多进程(一) 由于GIL的存在,Python的多线程并没有实现真正的并行.因此,一些问题使用threading模块并不能解决 不过Python为并行提供了一个替代方 ...

  6. Python之多线程与多进程(一)

    多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...

  7. python的多线程和多进程(一)

    在进入主题之前,我们先学习一下并发和并行的概念: --并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但任一时刻点上只有一个程序在处理 ...

  8. Python中多线程与多进程的恩恩怨怨

    概念: 并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运 ...

  9. python的多线程、多进程、协程用代码详解

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:刘早起早起 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

随机推荐

  1. VC9、VC11、VC14、VC15库 32位 64位 免费下载

    VC9.VC11.VC14.VC15库 32位 64位 免费下载 更新版本的PHP是用VC11,VC14或VC15(分别为Visual Studio 2012,2015或2017编译器)构建的,并且包 ...

  2. Springboot集成ES启动报错

    报错内容 None of the configured nodes are available elasticsearch.yml配置 cluster.name: fans node.name: no ...

  3. input模拟输入下拉框

       功能点: 输入.下拉选择.根据输入内容模糊检索.键盘上下键选择 实现思路: 显示隐藏: input获取焦点显示,失去焦点隐藏 下拉选择: 以父元素为基准,通过绝对定位定位至input输入下方 模 ...

  4. 通用图片加载组件UniversalImageLoader

    通用图片加载组件UniversalImageLoader   UniversalImageLoader是一款通用图片加载组件.该组件支持多种图片来源,如网络.SD卡.Assets文件夹等.在网络请求的 ...

  5. 手机端input获取焦点弹出键盘时挡住input解决方案

    问题重现 原始页面:页面中有header.main.footer三部分,其中 header 和 footer 通过 position: fixed; 定位在浏览器顶部和底部. 其中,footer 中有 ...

  6. Centos6.5部署Rsyslog-日志的存储方式及监测服务状态

    1.以IP地址命名 在/etc/rsyslog.conf中加入如下配置,并做好备注.添加这三行配置之后,远程日志会被单独输出到一个以IP命名的日志文件中. #IP format by zhz at x ...

  7. [Python]网络爬虫( 连载:大牛汪海 )

    汪海个人博客:http://blog.callmewhy.com/ Python爬虫专栏,汪海专栏 Python爬虫入门教程 简单的介绍如何使用Python的相关模块如urllib2来实现网络爬虫的基 ...

  8. 考前停课集训 Day6 垒

    Day 6 今天在家里的 家里蹲 其实是day7的时候想到要写day6了 草率补充一下 NOIP考前棕名退不掉咯 你觉得我还会打洛谷的题目吗? 依然退步 没用心 T1 分火腿 数论题 我感觉挺难的 T ...

  9. C#ConcurrentDictionary源代码

    using System; using System.Collections.Generic;using System.Text; using System.Threading; using Syst ...

  10. Maven实战(七)——常用Maven插件介绍(上)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...