python进程与

一,多进程:

(1)linux系统中,
调用fork
API,这个函数比较特殊,调用一次,会返回两次,因为系统把当前进程自动复制一份(子进程),并在各自的进程返回一次,子进程返回0,父进程返回子进程ID
用法:
import os
pid = os.fork()
pid = fork()
if pid == 0:
print(“My ID is: %s, forked by %s” %(os.getpid(), os.getppid()))
else:
print(“I am parent, my ID is %s, I create a process ID is %s”
%(os.getpid(), pid))
(2)windows系统
windows系统没有系统调用,有另外模块;multiprocessing:Process
用法:

  • 直接使用Process实例化一个进程,调用start方法启动子进程,调用join方法等待子进程结束 注意:这种方法需要指定新的进程执行的函数(target=func_name),传参数时使用元组的方式(args=(‘arg’,‘arg1’…)),尤其注意如果只有一个参数时(args=(‘test’,)), 元组第一个元素后要加个逗号
  • 继承Process类,然后重写其run(), 之后实例化,再调用start 注意:要启动子进程必须把代码加在(if name == ‘main’:)下面,上面的name和main前后都要加双下划线,,,
    代码:
    import os
    from multiprocessing import Process
    import time
    def run_pro(name, owner):
    #time.sleep(4)
    print(“Running process %s by (%s)” %(name, os.getpid()))

class MyProcess(Process):
def run(self):
time.sleep(3)
print(‘my process running…’)
if name == ‘main’:
print("parent process is: ", os.getpid())
p = Process(target=run_pro, args = (‘test’,‘admin’))
p.start()
p.join(timeout=2)
print(‘Main process is here…’)

print(‘another process…’)
m1 = MyProcess()
m1.start()
m1.join()
print(‘main process end’)

进程池:
批量创建子进程
代码:
def proc_func(name):
print(“Process: %s ID: %s start running.” %(name, os.getpid()))
start_time = time.time()
time.sleep(random.random()*3)
end_time = time.time()
print(“Process %s runs for %0.2f seconds.” %(name, end_time - start_time))
if name == ‘main’:
p = Pool(10) #pool默认大小是CPU核数
for i in range(10):
p.apply_async(proc_func, args=(i,))
p.close()
p.join() #等待所有子进程执行完毕,之前一定先调close()

python进程间通信
包括Queue, Pipe等方式
看下Queue通信方式,代码:
def write(q):
print(“process %s to put…” %os.getpid())
for item in [‘A’, ‘B’, ‘C’]:
print(“put %s to queue” %item)
q.put(item) #默认阻塞方式写,加入在多线程中,如果队列被其他线程写满,操作阻塞直到线程取走数据,如果非阻塞,满时会抛Queue.Full异常
time.sleep(random.random())
def read(q):
print(“process %s to get from queue…” %os.getpid())
while True:
value = q.get(True) #默认阻塞方式读,即如果队列为空,操作阻塞,直到有数据,如果非阻塞方式,则在队列空时抛Queue.Empty异常
print(“Value got is %s” %value)
if name == ‘main’:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
pw.start()
pr.start()
pw.join()
pr.terminate()#pr死循环,无法等待终止,这里强行结束伊

参考链接:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431927781401bb47ccf187b24c3b955157bb12c5882d000

https://my.oschina.net/yangyanxing/blog/296052

猜你喜欢

转载自blog.csdn.net/m0_37605956/article/details/83418726
今日推荐