多处理和全局 True/False 变量
Multiprocessing and global True/False variable
我正在努力了解多处理并将全局 True/False 变量传递到我的函数中。
在 get_data() 完成后,我希望 analysis() 函数启动并处理数据,而 fetch() 继续 运行。我怎样才能使这项工作? TIA
import multiprocessing
ready = False
def fetch():
global ready
get_data()
ready = True
return
def analysis():
analyse_data()
if __name__ == '__main__':
p1 = multiprocessing.Process(target=fetch)
p2 = multiprocessing.Process(target=analysis)
p1.start()
if ready:
p2.start()
您的示例由于以下几个原因无法运行:
- 进程之间不能共享一块内存(你不能在一个进程中更改全局而在另一个进程中看到更改)
- 即使您可以更改全局值,您检查它的速度也太快了,很可能它不会及时更改
阅读 https://docs.python.org/3/library/ipc.html 以获得 inter-process-communications
的更多可能性
您应该 运行 这两个进程并使用共享队列在它们之间交换信息,例如在其中一个进程中发出操作完成的信号。
此外,您需要有一个 join() 语句来正确等待您生成的进程完成。
from multiprocessing import Process, Queue
import time
def get_data(q):
#Do something to get data
time.sleep(2)
#Put an event in the queue to signal that get_data has finished
q.put('message from get_data to analyse_data')
def analyse_data(q):
#waiting for get_data to finish...
msg = q.get()
print msg #Will print 'message from get_data to analyse_data'
#get_data has finished
if __name__ == '__main__':
#Create queue for exchanging messages between processes
q = Queue()
#Create processes, and send the shared queue to them
processes = [Process(target=get_data,args(q,)),Process(target=analyse_data,args=(q,))]
#Start processes
for p in processes:
p.start()
#Wait until all processes complete
for p in processes:
p.join()
我正在努力了解多处理并将全局 True/False 变量传递到我的函数中。
在 get_data() 完成后,我希望 analysis() 函数启动并处理数据,而 fetch() 继续 运行。我怎样才能使这项工作? TIA
import multiprocessing
ready = False
def fetch():
global ready
get_data()
ready = True
return
def analysis():
analyse_data()
if __name__ == '__main__':
p1 = multiprocessing.Process(target=fetch)
p2 = multiprocessing.Process(target=analysis)
p1.start()
if ready:
p2.start()
您的示例由于以下几个原因无法运行:
- 进程之间不能共享一块内存(你不能在一个进程中更改全局而在另一个进程中看到更改)
- 即使您可以更改全局值,您检查它的速度也太快了,很可能它不会及时更改
阅读 https://docs.python.org/3/library/ipc.html 以获得 inter-process-communications
的更多可能性您应该 运行 这两个进程并使用共享队列在它们之间交换信息,例如在其中一个进程中发出操作完成的信号。
此外,您需要有一个 join() 语句来正确等待您生成的进程完成。
from multiprocessing import Process, Queue
import time
def get_data(q):
#Do something to get data
time.sleep(2)
#Put an event in the queue to signal that get_data has finished
q.put('message from get_data to analyse_data')
def analyse_data(q):
#waiting for get_data to finish...
msg = q.get()
print msg #Will print 'message from get_data to analyse_data'
#get_data has finished
if __name__ == '__main__':
#Create queue for exchanging messages between processes
q = Queue()
#Create processes, and send the shared queue to them
processes = [Process(target=get_data,args(q,)),Process(target=analyse_data,args=(q,))]
#Start processes
for p in processes:
p.start()
#Wait until all processes complete
for p in processes:
p.join()