import multiprocessing
global stop
stop = False
def makeprocesses():
processes = []
for _ in range(50):
p = multiprocessing.Process(target=runprocess)
processes.append(p)
for _ in range(50):
processes[_].start()
runprocess()
def runprocess():
global stop
while stop == False:
x = 1 #do something here
if x = 1:
stop = True
makeprocesses()
while stop == True:
x = 0
makeprocesses()
如果只有一個更改停止為 True,我怎么能讓所有其他 49 個行程停止?我認為因為 stop 是一個全域變數,一旦一個行程更改停止,所有其他行程都會停止。
uj5u.com熱心網友回復:
不。每個行程都有自己的副本。它對腳本是全域的,但不是跨行程的。請記住,每個行程都有一個完全獨立的地址空間。它獲取第一個行程資料的 COPY。
如果需要跨行程進行通信,則需要使用多處理檔案 ( https://docs.python.org/3/library/multiprocessing.html#synchronization-primitives )中的一種同步技術,例如事件或共享物件。
uj5u.com熱心網友回復:
每當您想要同步執行緒時,您都需要一些共享背景關系并確保它是安全的。正如@Tim Roberts 提到的,這些可以取自(https://docs.python.org/3/library/multiprocessing.html#synchronization-primitives)
嘗試這樣的事情:
import multiprocessing
from multiprocessing import Event
from time import sleep
def makeprocesses():
processes = []
e = Event()
for i in range(50):
p = multiprocessing.Process(target=runprocess,args= (e,i))
p.start()
processes.append(p)
for p in processes:
p.join()
def runprocess(e: Event() = None,name = 0):
while not e.is_set():
sleep(1)
if name == 1:
e.set() # here we make all other processes to stop
print("end")
if __name__ == '__main__':
makeprocesses()
我最喜歡的方法是使用取消令牌,這是一個包裝我們在這里所做的事情的物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/396524.html
下一篇:如何避免多次寫入CSV標頭
