如何在进程之间共享日期变量-多进程python
我试图在多个进程之间共享日期变量,但在这样做时遇到了一些问题 有人能帮我解决这个问题吗如何在进程之间共享日期变量-多进程python,python,python-3.x,multiprocessing,shared-memory,Python,Python 3.x,Multiprocessing,Shared Memory,我试图在多个进程之间共享日期变量,但在这样做时遇到了一些问题 有人能帮我解决这个问题吗 import os import multiprocessing from multiprocessing import Value import datetime import ctypes def worker(num): print(num.value,'date') if(str(num.value) == str(datetime.datetime.now().date())):
import os
import multiprocessing
from multiprocessing import Value
import datetime
import ctypes
def worker(num):
print(num.value,'date')
if(str(num.value) == str(datetime.datetime.now().date())):
date_flag = 0
else:
date_flag = 1
num.value = str(datetime.datetime.now().date())
print('this is child',os.getpid())
num = multiprocessing.Value(ctypes.c_wchar_p, '2000-01-01')
print(num.value)
p1 = multiprocessing.Process(target=worker,args=(num,))
p2 = multiprocessing.Process(target=worker,args=(num,))
p1.start()
p2.start()
p1.join()
p2.join()
当进程初始化时,我正在分配默认日期,如果系统日期与默认日期不匹配,则日期变量应该覆盖,并且它应该能够访问所有其他进程。
ctypes.c\u wchar\u p
是指针类型。尝试在进程之间共享会遇到以下问题:
注意:尽管可以在共享内存中存储指针,但请记住,这将引用特定进程地址空间中的位置。但是,指针在第二个进程的上下文中很可能无效,尝试从第二个进程取消引用指针可能会导致崩溃
摘自《圣经》
解决此问题的一种方法是使用多处理.Array
而不是多处理.Value
:
导入操作系统
导入多处理
导入日期时间
导入ctypes
def工作线程(num):
打印(数字[:],“日期”)
如果(num[:]==str(datetime.datetime.now().date()):
日期标志=0
其他:
日期标志=1
num[:]=str(datetime.datetime.now().date())
print('这是子项',os.getpid())
num=多处理.Array(ctypes.c_wchar,'2000-01-01')
打印(数字[:])
p1=多处理。进程(目标=工作者,参数=(num,))
p2=多处理。进程(目标=工作者,参数=(num,))
p1.开始()
p2.start()
p1.join()
p2.join()
打印(数字[:])
使用此方法需要注意的一点是,生成的数组具有固定大小,因此如果不事先指定大小(通过相应地设置数组
初始化器中的第二个参数),您将无法在其中存储任意长的字符串。但是,当您使用日期字符串时,这应该很好,因为它们都具有相同的长度
另请注意使用
num[:]
(即\uuu getslice\uuu
和\uu setslice\uuu
)而不是num.value
ctypes.c\u wchar\u p
是指针类型。尝试在进程之间共享会遇到以下问题:
注意:尽管可以在共享内存中存储指针,但请记住,这将引用特定进程地址空间中的位置。但是,指针在第二个进程的上下文中很可能无效,尝试从第二个进程取消引用指针可能会导致崩溃
摘自《圣经》
解决此问题的一种方法是使用多处理.Array
而不是多处理.Value
:
导入操作系统
导入多处理
导入日期时间
导入ctypes
def工作线程(num):
打印(数字[:],“日期”)
如果(num[:]==str(datetime.datetime.now().date()):
日期标志=0
其他:
日期标志=1
num[:]=str(datetime.datetime.now().date())
print('这是子项',os.getpid())
num=多处理.Array(ctypes.c_wchar,'2000-01-01')
打印(数字[:])
p1=多处理。进程(目标=工作者,参数=(num,))
p2=多处理。进程(目标=工作者,参数=(num,))
p1.开始()
p2.start()
p1.join()
p2.join()
打印(数字[:])
使用此方法需要注意的一点是,生成的数组具有固定大小,因此如果不事先指定大小(通过相应地设置数组
初始化器中的第二个参数),您将无法在其中存储任意长的字符串。但是,当您使用日期字符串时,这应该很好,因为它们都具有相同的长度
另请注意使用num[:]
(即\uuuu getslice\uuuu
和\uuu setslice\uuu
)而不是num.value