138 python|第八部分:并发网络编程多任务编程上--进程
Posted 缓缓而行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了138 python|第八部分:并发网络编程多任务编程上--进程相关的知识,希望对你有一定的参考价值。
-u 用户名
sleep(2)
print("func01 over")
sleep(3)
print("func02 over")
print("error")
func01()
func02()
![](https://image.cha138.com/20220219/a9fffc5c5ce64eee8fe5b3ba5db49f4d.jpg)
print("child pid:",os.getpid())#获取当前进程(子进程)的进程号
print("parent pid", os.getppid())#获取父进程的进程号
print("parent pid",os.getpid())#获取当前进程(父进程)的进程号
print("child pid:",pid)#父进程的返回值是子进程的 pid
![](https://image.cha138.com/20220219/fce5863282de4979a42908a5b004293a.jpg)
print("child pid:",os.getpid())#获取当前进程(子进程)的进程号
print("parent pid", os.getppid())#获取父进程的进程号
![](https://image.cha138.com/20220219/51ce9f4aa8da412ca64010c7148c67f4.jpg)
print( print( print( sleep(2)
print("func01")
sleep(3)
print("func02")
print("error")
pid_0 = os.fork()#二级子进程
if pid_0 ==0:
func01()#执行二级子进程
else:#一级子进程
os._exit(0)#在创建完二级子进程后直接退出
os.wait()
func02()#等一级子进程结束,执行这句
![](https://image.cha138.com/20220219/2b80aa060ec244a3b62ad81d8b2eea46.jpg)
print("child process",os.getpid())
os._exit(0)
while True:
pass
![](https://image.cha138.com/20220219/49706d56293e47d2b0366003b58be931.jpg)
os
time sleep
sleep( print(os.getppid(), sleep( print(os.getppid(), sleep( print(os.getppid(),th [fun1,fun2,fun3]:
p = Process(target=th)
jobs.append(p)
p.start()
i jobs:
i.join()
![](https://image.cha138.com/20220219/983aacbddbb844dbb52ae470837c98f1.jpg)
sleep(sec)
print("I\'m %s"%name)
print("I\'m working...")
multiprocessing Process
os
fr = open(filename, fw = open( n = size // fw.write(fr.read(n))
fr.close()
fw.close()
fr = open(filename, fw = open( fr.seek(size// fw.write(fr.read())
fr.close()
fw.close()
print( print( __name_== p = MyProcess( p.start() p.join()
i range( n % i == False
True prime = []
i range( ifprime(i) prime.append(i) sum(prime) = = i range( ifprime(i):
sum( prime = [] processes = [] i range( p = prime2(prime,i,i+ p.start() processes.append(p) [process.join() process processes] prime = []
processes = []
i range( f = prime2(prime,i,i+ f.start()
processes.append(f)
[process.join() process processes]
__name_== use10_multi_process()给func函数以字典形式位置传参
事件函数
multiprocessing Pool
time sleep
os
sleep( print(os.getpid(), msgi range( msg = r = pool.apply_async(func=fun,args=(msg,))multiprocessing Pool
time sleep
sleep( print( n * n
当block为True表示超时时间
注:block和timeout二选一
time sleep
i range( sleep( q.put( print(q.get(timeout= return
p1 = Process(target=bar)#进程1
p2 = Process(target=foo)#进程2
p1.start()#开启进程1
p2.start()#开启进程2
p1.join()#回收进程1
p2.join()#回收进程2
"""
使用进程池拷贝一个目录及目录中的所有内容
目录中的内容均为普通文件;
进程池中执行的每个进程事件拷贝一个文件
实时显示拷贝的百分比
拷贝目录:/home/huanhuan/myfile/target
"""
![](https://image.cha138.com/20220219/cdbc3bbe6a94423d8efa62ff4d79ed02.jpg)
![](https://image.cha138.com/20220219/f28d86a1d6d04e8a9288a3c2b002c740.jpg)
![](https://image.cha138.com/20220219/040476611b97436b83c98fb2698aafe0.jpg)
![](https://image.cha138.com/20220219/0a8890c66e5d41288f5bb7a9904fb367.jpg)
![](https://image.cha138.com/20220219/b4e36caa5cc64a0ea89b4568f94d54e5.jpg)
![](https://image.cha138.com/20220219/915e621173e84434afe3473db676f795.jpg)
![](https://image.cha138.com/20220219/7a8497342b5a4a6bbbc0851386ab1ef0.jpg)
![](https://image.cha138.com/20220219/9313ae206eb9493c8a30efda582568d7.jpg)
![](https://image.cha138.com/20220219/46bde8a810624a9da3f41ba038ab3aab.jpg)
![](https://image.cha138.com/20220219/0bcf942ae36c4baa8d73bab23a5d49a3.jpg)
![](https://image.cha138.com/20220219/587fe8285c6c42bb886cf32d89b960c5.jpg)
参考资料
花样早餐展
![](https://image.cha138.com/20220219/6ef946bae24546a0a2b409f4c2cd31b8.jpg)
139 python|第八部分:并发网络编程多任务编程下--线程
time sleep
i range( sleep( print(i range( sleep(threading Thread
time sleep
print( sleep(sec)
print(i range( t = Thread(target = func,
args = ( kwargs = )
t.start()threading Thread
time sleep
self.song = song
super().__init__()
i range( sleep( print(threading Threadfrom time sleepthreading
time
print(% threading.currentThread().getName())
event.wait() print(% threading.currentThread().getName())
threading Thread,Lock
lock.acquire() a != b: print( lock.release() lock.acquire() a += b += lock.release()time sleep
self.id = id
self.balance = balance
self.balance -= amount
self.balance += amount
self.balance
from_.lock.acquire() from_.get(amount) sleep( to.lock.acquire() to.put(amount) from_.lock.release() to.lock.release()
#一方给另一方转钱
trans(Peiqi,George,10)
print(\'Peiqi:\',George.getbalance())
print(\'George:\',Peiqi.getbalance())
阻塞的原因是产生了死锁。根据上面提到的死锁的避免方式,我们只要让死锁四个产生条件不要同时出现即可。
运行结果:
05 GIL(global interpreter lock)问题
![](https://image.cha138.com/20220220/23f49ca3c7e240458b92bf58c6200bfa.jpg)
![](https://image.cha138.com/20220220/9a4f5acbc34d4cadafa1a1081ac68286.jpg)
5.1 概念
1.GIL问题与python语言本身没什么关系,属于解释器设置历史的问题。
2.在无阻塞状态下,多线程程序执行效率并不高,甚至还不如单线程。
3.python多线程只适用于执行有阻塞延迟的任务情形。
06 进程和线程的联系&区别
![](https://image.cha138.com/20220220/23f49ca3c7e240458b92bf58c6200bfa.jpg)
![](https://image.cha138.com/20220220/9a4f5acbc34d4cadafa1a1081ac68286.jpg)
6.1 联系&区别
进程和线程的联系&区别 | |
---|---|
类别 | 说明 |
联系 | 1.两者都是多任务编程,都能使用计算机多核资源 |
2.一个进程可以有多个分支线程,两者有包含关系 | |
3.多个线程共享进程资源,在共享资源操作时往往需要同步互斥处理。 | |
区别 | 1.进程的创建和删除消耗的计算机资源比线程多 |
2.进程空间独立,数据互不干扰,有专门的通信方法;线程使用全局变量通信 | |
3.python线程存在GIL问题,但进程没有 |
![](https://image.cha138.com/20220220/147809cd5c87428fb73ec4e09b766b35.jpg)
![](https://image.cha138.com/20220220/93565eff057d4547943cf2829f40352f.jpg)
![](https://image.cha138.com/20220220/9a4f5acbc34d4cadafa1a1081ac68286.jpg)
参考资料
![](https://image.cha138.com/20220220/9a4f5acbc34d4cadafa1a1081ac68286.jpg)
拓展资料
花样早餐展
以上是关于138 python|第八部分:并发网络编程多任务编程上--进程的主要内容,如果未能解决你的问题,请参考以下文章
Python自动化 第八篇:Python基础-Socket编程进阶