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

制作网站的程序语言同一个地方做几个网站

制作网站的程序语言,同一个地方做几个网站,咖啡网站建设的优势,2016建设银行辽宁招聘网站进程、线程和协程之间的关系和区别也困扰我一阵子了#xff0c;最近有一些心得#xff0c;写一下。 进程拥有自己独立的堆和栈#xff0c;既不共享堆#xff0c;亦不共享栈#xff0c;进程由操作系统调度。 线程拥有自己独立的栈和共享的堆#xff0c;共享堆#xff0…进程、线程和协程之间的关系和区别也困扰我一阵子了最近有一些心得写一下。 进程拥有自己独立的堆和栈既不共享堆亦不共享栈进程由操作系统调度。 线程拥有自己独立的栈和共享的堆共享堆不共享栈线程亦由操作系统调度(标准线程是的)。 协程和线程一样共享堆不共享栈协程由程序员在协程的代码里显式调度。 进程和其他两个的区别还是很明显的。 协程和线程的区别是协程避免了无意义的调度由此可以提高性能但也因此程序员必须自己承担调度的责任同时协程也失去了标准线程使用多CPU的能力。 打个比方吧假设有一个操作系统是单核的系统上没有其他的程序需要运行有两个线程 A 和 B A 和 B 在单独运行时都需要 10 秒来完成自己的任务而且任务都是运算操作A B 之间也没有竞争和共享数据的问题。现在 A B 两个线程并行操作系统会不停的在 A B 两个线程之间切换达到一种伪并行的效果假设切换的频率是每秒一次切换的成本是 0.1 秒(主要是栈切换)总共需要 20 19 * 0.1 21.9 秒。如果使用协程的方式可以先运行协程 A A 结束的时候让位给协程 B 只发生一次切换总时间是 20 1 * 0.1 20.1 秒。如果系统是双核的而且线程是标准线程那么 A B 两个线程就可以真并行总时间只需要 10 秒而协程的方案仍然需要 20.1 秒。 一个实际一点的例子thread.py #!/usr/bin/python# python thread.py# python -m gevent.monkey thread.pyimport threadingclass Thread(threading.Thread):def __init__(self, name):threading.Thread.__init__(self)self.name namedef run(self):for i in xrange(10):print self.namethreadA Thread(A)threadB Thread(B)threadA.start()threadB.start() 运行 python thread.py如果你的输出是均匀的: A B A B ...那么总共发生了 20 次切换主线程 - A - B - A - B … 再看一个协程的例子gr.py #!/usr/bin/python# python gr.pyimport greenletdef run(name, nextGreenlets):for i in xrange(10):print nameif nextGreenlets:nextGreenlets.pop(0).switch(chr(ord(name) 1), nextGreenlets)greenletA greenlet.greenlet(run)greenletB greenlet.greenlet(run)greenletA.switch(A, [greenletB]) greenlet 是 python 的协程实现。 运行 python gr.py此时发生了 2 次切换主协程 - A - B 可能你已经注意到了还有一个命令 python -m gevent.monkey thread.pygevent 是基于 greenlet 的一个 python 库它可以把 python 的内置线程用 greenlet 包装这样在我们使用线程的时候实际上使用的是协程在上一个协程的例子里协程 A 结束时由协程 A 让位给协程 B 而在 gevent 里所有需要让位的协程都让位给主协程由主协程决定运行哪一个协程gevent 也会包装一些可能需要阻塞的方法比如 sleep 比如读 socket 比如等待锁等等在这些方法里会自动让位给主协程而不是由程序员显示让位这样程序员就可以按照线程的模式进行线性编程不需要考虑切换的逻辑。 gevent 版的命令发生了 3 次切换主协程 - A - 主协程 - B 假设代码质量相同用原生的协程实现需要切换 n 次用协程包装后的线程实现就需要 2n - 1 次姑且算是两倍吧。很显然单纯从效率上来说代码质量相同的前提下用 gevent 永远也不可能比用 greenlet 快然而问题往往不那么单纯比方说单纯从效率上来说代码质量相同的前提下用 C 实现的程序永远不可能比汇编快。 再来说说 python 的线程python 的线程不是标准线程在 python 中一个进程内的多个线程只能使用一个 CPU 。 重新来看一下协程和线程的区别协程避免了无意义的调度由此可以提高性能但也因此程序员必须自己承担调度的责任同时协程也失去了标准线程使用多CPU的能力。 如果使用 gevent 包装后的线程程序员就不必承担调度的责任而 python 的线程本身就没有使用多 CPU 的能力那么用 gevent 包装后的线程取代 python 的内置线程不是只有避免无意义的调度提高性能的好处而没有什么坏处了吗 答案是否定的。举一个例子有一个 GUI 程序上面有两个按钮一个 运算 一个 取消 点击运算会有一个运算线程启动不停的运算点击取消会取消这个线程如果使用 python 的内置线程或者标准线程都是没有问题的即便运算线程不停的运算调度器仍然会给 GUI 线程分配时间片用户可以点击取消然而如果使用 gevent 包装后的线程就完蛋了一旦运算开始GUI 就会失去相应因为那个运算线程(协程)霸着 CPU 不让位。不单是 GUI 所有和用户交互的程序都会有这个问题。
http://www.pierceye.com/news/337802/

相关文章:

  • 网站一年的 运营费用一般企业网站建设合同
  • 九龙坡集团网站建设贵阳网站建设推广
  • 架设网站 自己购买服务器无锡seo网站推广费用
  • 网站关键词长度开平 做一网站
  • 青海制作网站可以网站可以做免费的文案广告
  • 深圳维特网站建设有彩虹代刷源码怎么做网站
  • 有了自己的网站怎样做后台食品建设网站前的市场分析
  • 制作伪装网站微餐饮网站建设
  • 泰州做网站软件哈尔滨网站建设市场分析
  • 手机网站建设口碑好网站的技术建设
  • 论坛类网站备案wordpress分享qq
  • 做化工的在哪个网站做平台好长期做网站应该购买稳定的空间
  • 网站建设 推广找山东博达制作网页难吗
  • 临安网站设计海口h5建站模板
  • 网站建设济南云畅网络技术有限公司厦门最新通告
  • ozon电商平台seo关键词搜索和优化
  • 网站收录查询情况科技网站导航
  • 如何做有后台的网站模板网站和定制网站的优劣势对比
  • 在360网站做公告怎么弄南平建设企业网站
  • 网站建设电影动漫制作专业什么电脑最适合
  • 企业做网站公司有哪些wordpress登陆不了一直返回首页
  • 汽车网站建设公司哪家好长春做网站多少钱
  • 雄安移动网站建设php网站用什么软件
  • 网站开发税收分类山东平台网站建设制作
  • 企业自助建站网手机怎么制作钓鱼网站
  • 家乡ppt模板免费下载网站x wordpress 视差 主题
  • 淄博张店外贸建站公司手机微信网页版
  • 网站建设全域云网站建设流程详解
  • 梅州市五华县建设银行网站写作网站招聘
  • 博物馆网站建设情况工业互联网龙头公司排名