代碼開啟進程和線程的方式,代碼書寫基本是一樣的,你學會了如何開啟進程就學會了如何開啟線程
from multiprocessing import Process
import time
def task(name):
print('%s is running'%name)
time.sleep(3)
print('%s is over'%name)
if __name__ == '__main__':
# 1 創建一個對象
p = Process(target=task, args=('jason',))
# 容器類型哪怕里面只有1個元素 建議要用逗號隔開
# 2 開啟進程
p.start() # 告訴操作系統幫你創建一個進程 異步
print('主')
# 第二種方式 類的繼承
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print('hello bf girl')
time.sleep(1)
print('get out!')
if __name__ == '__main__':
p = MyProcess()
p.start()
print('主')
總結
"""
創建進程就是在內存中申請一塊內存空間將需要運行的代碼丟進去
一個進程對應在內存中就是一塊獨立的內存空間
多個進程對應在內存中就是多塊獨立的內存空間
進程與進程之間數據默認情況下是無法直接交互,如果想交互可以借助於第三方工具、模塊
"""
鳴謝:jason老師
Python3關於多進程和if name == “main“的問題
代碼如下:
`#coding:'utf-8'
import multiprocessing
import os
def pro():
print('子進程', os.getpid())
# if __name__ == '__main__':
p1 = multiprocessing.Process(target=pro)
p1.start()`
運行出錯:
…
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if name == ‘main‘:
freeze_support()
…
The “freeze_support()” line can be omitted if the program
is not going to be frozen to produce an executable.
…
原因
這是 Windows 上多進程的實現問題。在 Windows 上,子進程會自動 import 啟動它的這個文件,而在 import 的時候是會執行這些語句的。如果你這么寫的話就會無限遞歸創建子進程報錯。但是在multiprocessing.Process的源碼中是對子進程再次產生子進程是做了限制的,是不允許的,於是出現如上的錯誤提示。所以必須把創建子進程的部分用那個 if 判斷保護起來,import 的時候 name 不是 main ,就不會遞歸運行了。
————————————————
版權聲明:本文為CSDN博主「llf_cloud」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/llf_cloud/article/details/81775410```