标签:查看 sync param command 第一个 time 模块 mon 否则
僵尸进程与进程
Windows上创建子进程的函数为CreateProcess(), 也是字如其名, 是创建一个进程而不是复制一个进程。CreateProcess()函数的API是
BOOL CreateProcessA(
LPCSTR lpApplicationName, // 进程要执行的.exe文件名
LPSTR lpCommandLine, // 执行的.exe的命令行参数
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
我们主要看API的第1和第2个参数, 很明显, CreateProcess()API可以创建一个与当前父进程完全不同的子进程, 因为它接受一个.exe文件的路径, 该路径可以是任何一个.exe文件, 将该.exe文件加载到内存中CPU从头开始执行代码, 如果要实现与类Unix中fork()函数类似的功能, CreateProcess()的第一个参数应该为父进程的.exe文件的位置, 这样就创建出来一个与父进程一样的子进程了, 但是刚才说了是类似, 肯定有不同, 类Unix中fork出来的子进程的入口是父进程fork语句的下一条指令, 而CreateProcess是从头开始执行子进程
在main.py中
```py
import time
import multiprocessing
from multiprocessing import Process
def foo():
time.sleep(3)
print(‘this is foo function‘)
p = Process(target=foo)
p.start()
python3 main.py
, 报错: 常见了无限个进程__name__ == __main__
而子进程__name__ != __main__
规避
import time
import multiprocessing
from multiprocessing import Process
def foo():
time.sleep(3)
print(‘this is foo function‘)
if __name__ == ‘__main__‘:
p = Process(target=foo)
p.start()
print(‘Finish‘)
lock = Lock()
with Manager() as m:
d = m.dict({‘data‘: 100})
p = Process(target=foo, args=(d, lock))
p.start()
标签:查看 sync param command 第一个 time 模块 mon 否则
原文地址:https://www.cnblogs.com/megachen/p/10360030.html