Python 进程

Python 进程,第1张

你的service是一个线程,只是一个线程

按照你的想法,你需要一个线程池threadPool

让你的service去拥有一个线程池

python有第三方线程池库

还有python的多线程不能利用多核CPU,除非阻塞IO,不然不要用多线程

序 multiprocessing

python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

回到顶部

1 Process

创建进程的类:Process([group [, target [, name [, args [, kwargs]]]]]),target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。name为别名。group实质上不使用。

方法:is_alive()、join([timeout])、run()、start()、terminate()。其中,Process以start()启动某个进程。

属性:authkey、daemon(要通过start()设置)、exitcode(进程在运行时为None、如果为–N,表示被信号N结束)、name、pid。其中daemon是父进程终止后自动终止,且自己不能产生新进程,必须在start()之前设置。

例11:创建函数并将其作为单个进程

import multiprocessingimport timedef worker(interval):

n = 5    while n > 0:        print("The time is {0}"format(timectime()))

timesleep(interval)

n -= 1if __name__ == "__main__":

p = multiprocessingProcess(target = worker, args = (3,))

pstart()    print "ppid:", ppid    print "pname:", pname    print "pis_alive:", pis_alive()

结果

12345678ppid: 8736pname: Process-1pis_alive: TrueThe time is Tue Apr 21 20:55:12 2015The time is Tue Apr 21 20:55:15 2015The time is Tue Apr 21 20:55:18 2015The time is Tue Apr 21 20:55:21 2015The time is Tue Apr 21 20:55:24 2015

例12:创建函数并将其作为多个进程

import multiprocessingimport timedef worker_1(interval):    print "worker_1"

timesleep(interval)    print "end worker_1"def worker_2(interval):    print "worker_2"

timesleep(interval)    print "end worker_2"def worker_3(interval):    print "worker_3"

timesleep(interval)    print "end worker_3"if __name__ == "__main__":

p1 = multiprocessingProcess(target = worker_1, args = (2,))

p2 = multiprocessingProcess(target = worker_2, args = (3,))

p3 = multiprocessingProcess(target = worker_3, args = (4,))

p1start()

p2start()

p3start()    print("The number of CPU is:" + str(multiprocessingcpu_count()))    for p in multiprocessingactive_children():        print("child   pname:" + pname + "\tpid" + str(ppid))    print "END!!!!!!!!!!!!!!!!!"

结果

1234567891011The number of CPU is:4child   pname:Process-3    pid7992child   pname:Process-2    pid4204child   pname:Process-1    pid6380END!!!!!!!!!!!!!!!!!worker_1worker_3worker_2end worker_1end worker_2end worker_3

任何一种编程语言,启动进程和关闭进程都是跟 *** 作系统相关的 *** 作,python中与 *** 作系统打交道的话,推荐使用os模块。

ossystem() 函数可以启动一个进程,执行完之后返回状态码。

osfork() 复制一个进程,如果是子进程返回0,如果是父进程返回子进程的pid,使用这个函数的时候,建议你学习一下linux编程的知识。

ospopen 以管道的方式创建进程。

osspawnl 也可以创建进程,并能指定环境变量。

oskill(pid, sig) 关闭一个进程,pid是进程号,sig是信号。与fork配合使用,例如你刚才用fork创建了一个子进程,它的pid是11990, 那么调用

oskill( 11990, signalCTRL_BREAK_EVENT)

就以ctrl+c的方式杀死了这个进程。

另外还有一个模块multiprocessing,这个模块封装了很多创建进程和进程间通信的 *** 作,可以让你发挥多核的威力。

通过pid,下面的procStatus() 在linux 系统查询进程pid 状态,z 代表僵死进程:

def procStatus(pid):

   for line in open("/proc/%d/status" % pid)readlines():

       if linestartswith("State:"):

           return linesplit(":",1)[1]strip()split(' ')[0]

   return None

另外可以用 psutils:

import psutil

p = psutilProcess(the_pid_you_want)

if pstatus == psutilSTATUS_ZOMBIE:

   

在利用Python进行系统管理的时候,特别是同时 *** 作多个文件目录,或者远程控制多台主机,并行 *** 作可以节约大量的时间。多进程是实现并发的手段之一,需要注意的问题是:

例如当被 *** 作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个。。。手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

我们就可以通过维护一个进程池来控制进程数目,比如>

以上就是关于Python 进程全部的内容,包括:Python 进程、python进程能实现吗、python哪个函数启动进程和关闭进程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10214444.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存