Python 在子进程中访问字符串值时冻结
Python freezes when accessing string value in subprocess
我花了将近一整天的时间来完成我的知识:
我想更改子进程中的共享 multiprocessing.Value 字符串,但是 python 在子进程尝试更改共享值时立即挂起。
下面是一个示例代码:
from multiprocessing import Process, Value, freeze_support
from ctypes import c_wchar_p
def test(x):
with x.get_lock():
x.value = 'THE TEST WORKED'
return
if __name__ == "__main__":
freeze_support()
value = Value(c_wchar_p, '')
p = Process(target=test, args = (value,))
p.start()
print(p.pid)
# this try block is to also allow p.run()
try:
p.join()
p.terminate()
except:
pass
print(value.value)
我试过但不起作用的方法:
- 我尝试了 ctypes
c_wchar_p
和 c_char_p
,但两者都导致相同的冻结。
- 没有
x.get_lock()
我也试过了
- 没有
freeze_support()
我也试过了
什么有效(但没有帮助):
- 使用浮点数作为共享值(
value = Value('d',0)
和 x.value = 1
)。
- 运行 不启动子流程的流程(将
p.start()
替换为 p.run()
)
我正在使用 Windows 10 64 位和 Python 3.6.4(Spyder,但也在 Spyder 之外尝试过)。
欢迎任何帮助!
共享指针在另一个进程中不起作用,因为该指针仅在创建它的进程中有效。相反,使用数组:
import multiprocessing as mp
def test(x):
x.value = b'Test worked!'
if __name__ == "__main__":
x = mp.Array('c',15)
p = mp.Process(target=test, args = (x,))
p.start()
p.join()
print(x.value)
输出:
b'Test worked!'
请注意,数组类型 'c'
是专用的,return 是 SynchronizedString
与 return SynchronizedArray
的其他类型相比。以下是如何使用类型 'u'
例如:
import multiprocessing as mp
from ctypes import *
def test(x):
x.get_obj().value = 'Test worked!'
if __name__ == "__main__":
x = mp.Array('u',15)
p = mp.Process(target=test, args = (x,))
p.start()
p.join()
print(x.get_obj().value)
输出:
Test worked!
请注意,对包装值的非原子操作(例如 +=
执行 read/modify/write 的操作应使用 with x.get_lock():
上下文管理器进行保护。
我花了将近一整天的时间来完成我的知识:
我想更改子进程中的共享 multiprocessing.Value 字符串,但是 python 在子进程尝试更改共享值时立即挂起。
下面是一个示例代码:
from multiprocessing import Process, Value, freeze_support
from ctypes import c_wchar_p
def test(x):
with x.get_lock():
x.value = 'THE TEST WORKED'
return
if __name__ == "__main__":
freeze_support()
value = Value(c_wchar_p, '')
p = Process(target=test, args = (value,))
p.start()
print(p.pid)
# this try block is to also allow p.run()
try:
p.join()
p.terminate()
except:
pass
print(value.value)
我试过但不起作用的方法:
- 我尝试了 ctypes
c_wchar_p
和c_char_p
,但两者都导致相同的冻结。 - 没有
x.get_lock()
我也试过了
- 没有
freeze_support()
我也试过了
什么有效(但没有帮助):
- 使用浮点数作为共享值(
value = Value('d',0)
和x.value = 1
)。 - 运行 不启动子流程的流程(将
p.start()
替换为p.run()
)
我正在使用 Windows 10 64 位和 Python 3.6.4(Spyder,但也在 Spyder 之外尝试过)。
欢迎任何帮助!
共享指针在另一个进程中不起作用,因为该指针仅在创建它的进程中有效。相反,使用数组:
import multiprocessing as mp
def test(x):
x.value = b'Test worked!'
if __name__ == "__main__":
x = mp.Array('c',15)
p = mp.Process(target=test, args = (x,))
p.start()
p.join()
print(x.value)
输出:
b'Test worked!'
请注意,数组类型 'c'
是专用的,return 是 SynchronizedString
与 return SynchronizedArray
的其他类型相比。以下是如何使用类型 'u'
例如:
import multiprocessing as mp
from ctypes import *
def test(x):
x.get_obj().value = 'Test worked!'
if __name__ == "__main__":
x = mp.Array('u',15)
p = mp.Process(target=test, args = (x,))
p.start()
p.join()
print(x.get_obj().value)
输出:
Test worked!
请注意,对包装值的非原子操作(例如 +=
执行 read/modify/write 的操作应使用 with x.get_lock():
上下文管理器进行保护。