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

网站项目设计/知乎营销平台

网站项目设计,知乎营销平台,武汉企业黄页大全,在小网站上做点击广告本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧。分享给大家供大家参考。具体分析如下:一般来说,由于Python的线程有些限制,例如多线程不能充分利用多核CPU等问题,因此在Python中我们更倾向…

本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧。分享给大家供大家参考。具体分析如下:

一般来说,由于Python的线程有些限制,例如多线程不能充分利用多核CPU等问题,因此在Python中我们更倾向使用多进程。但在做不阻塞的异步UI等场景,我们也会使用多线程。本篇文章主要探讨Python多进程的问题。

Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。使用这些组件,可以方便地编写多进程并发程序。

Process

Process的使用有点像java.lang.Thread,但Thread是线程。start方法用以启动某个进程。一个简单的示例:

from multiprocessing import Process

import os

import time

def sleeper(name, seconds):

print "Process ID# %s" % (os.getpid())

print "Parent Process ID# %s" % (os.getppid())

print "%s will sleep for %s seconds" % (name, seconds)

time.sleep(seconds)

if __name__ == "__main__":

child_proc = Process(target=sleeper, args=('bob', 5))

child_proc.start()

print "in parent process after child process start"

print "parent process abount to join child process"

child_proc.join()

print "in parent process after child process join"

print "the parent's parent process: %s" % (os.getppid())

实例化一个Process必须要指定target和args。target是新的进程的入口方法,可以认为是main方法。args是该方法的参数列表。启动进程类似于启动Thread,必须要调用start方法。也可以继承Process,覆盖run方法,在run方法中实现该进程的逻辑。调用join方法会阻塞当前调用进程,直到被调用进程运行结束。

手工终止一个进程可以调用terminate方法,在UNIX系统中,该方法会发送SIGTERM信号量,而在windows系统中,会借助TerminateProcess方法。需要注意的是,exit处理逻辑并不会被执行,该进程的子进程不会被终止,他们只会变成孤儿进程。

Queue

Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。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异常。Queue的一段示例代码:

from multiprocessing import Process, Queue

def offer(queue):

queue.put("Hello World")

def test(queue, num):

queue.put("Hello World: " + str(num))

if __name__ == '__main__':

q = Queue()

p1 = Process(target=test, args=(q, 1))

p1.start()

p = Process(target=offer, args=(q,))

p.start()

p2 = Process(target=test, args=(q, 2))

p2.start()

p2 = Process(target=test, args=(q, 3))

p2.start()

print q.get()

print q.get()

print q.get()

print q.get()

print q.close()

输出:

Hello World: 1

Hello World

Hello World: 2

None

Pipes

Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息。

send和recv方法分别是发送和接受消息的方法。例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError。

from multiprocessing import Process, Pipe

def send(conn):

conn.send("Hello World")

conn.close()

if __name__ == '__main__':

parent_conn, child_conn = Pipe()

p = Process(target=send, args=(child_conn,))

p.start()

print parent_conn.recv()

同步

multiprocessing包提供了Condition, Event, Lock, RLock, Semaphore等组件可用于同步。下面是使用Lock的一个示例:

from multiprocessing import Process, Lock

def l(lock, num):

lock.acquire()

print "Hello Num: %s" % (num)

lock.release()

if __name__ == '__main__':

lock = Lock()

for num in range(20):

Process(target=l, args=(lock, num)).start()

总结

以上是Python multiprocessing库的简单介绍和实例,熟悉Java多线程开发的同学是不是觉得很熟悉,和java的Concurrency API很像,不过javaConcurrency是处理多线程的而已,我们可以直接按照以前Java多线程的经验用这些API。

感兴趣的朋友可以测试运行本文实例以加深理解。相信本文所述对大家Python程序设计的学习有一定的借鉴价值。

http://www.lbrq.cn/news/756649.html

相关文章:

  • 做网站接雕塑业务/百度站内搜索的方法
  • 电子商务网站的建设视频/seo搜索引擎优化公司
  • 南昌网站搜索排名/企业百度推广怎么收费
  • 卖域名的公司 骗做网站/百度快照优化培训班
  • 网站开发需要准备什么材料/灰色项目推广渠道
  • wordpress微站/深圳做推广哪家比较好
  • 网站首页的导航栏/重庆seo网站推广优化
  • 有关网站建设的电子商务论文/推广优化网站排名教程
  • 中小企业网站建设与管理/营销方式和手段
  • php做网站/海口做网站的公司
  • 成都网站建设科技公司/bt鹦鹉磁力
  • 怎么做足球直播网站/如何优化搜索关键词
  • 湖南省水利水电建设工程学校网站/推广公司简介
  • 装饰公司logo设计图片大全/百度seo培训要多少钱
  • 外汇网站源码 asp/南昌seo外包公司
  • 铜陵网站建设/湖北最新消息
  • 织梦网站添加视频教程/营销网站建设选择
  • 设计师对网站的意义/济南最新消息
  • 帮助企业做网站的销售/网络营销的营销方式
  • 福田区南山区龙岗区/成都网站seo报价
  • 对象存储oss做视频网站/百度网盘人工客服电话多少
  • seo流量/win10优化软件哪个好
  • 网站的二维码怎么做的/网站推广教程
  • 如何搭建网站/seo网站优化培训怎么做
  • 自助网站免费/百度小说排行榜第一名
  • 坪山手机网站建设/b站新人视频怎么推广
  • 企业做网站被骗/惠州百度seo排名
  • 王悦做网站/seo搜论坛
  • 免费信息网站建设平台/如何优化推广网站
  • 二手房网签合同在哪个网站做/设计外包网站
  • springboot集成websocket
  • Day2--滑动窗口与双指针--2090. 半径为 k 的子数组平均值,2379. 得到 K 个黑块的最少涂色次数,2841. 几乎唯一子数组的最大和
  • 【科研绘图系列】R语言绘制三维曲线图
  • 链路聚合与软件网桥配置
  • C语言:指针(5)
  • gitee_流水线搭配 Dockerfile 部署vue项目