Theo mặc định, mã chạy trong các quy trình khác nhau không chia sẻ cùng một dữ liệu. Tuy nhiên, mô-đun
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
8 chứa các giá trị nguyên thủy để giúp chia sẻ các giá trị trên nhiều quy trìnhimport multiprocessing
plain_num = 0
shared_num = multiprocessing.Value['d', 0]
lock = multiprocessing.Lock[]
def increment[]:
global plain_num
with lock:
# ordinary variable modifications are not visible across processes
plain_num += 1
# multiprocessing.Value modifications are
shared_num.value += 1
ps = [multiprocessing.Process[target=increment] for n in range[4]]
for p in ps:
p.start[]
for p in ps:
p.join[]
print["plain_num is %d, shared_num is %d" % [plain_num, shared_num.value]]
# Out: plain_num is 0, shared_num is 4
Tôi có một đối tượng Python khá phức tạp mà tôi cần chia sẻ giữa nhiều quy trình. Tôi khởi chạy các quy trình này bằng cách sử dụng
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
1. Khi tôi chia sẻ một đối tượng với from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
2 và from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
3 trong đó, chúng được chia sẻ bình thường. Nhưng khi tôi cố gắng chia sẻ một đối tượng với các đối tượng không phải mô-đun đa xử lý khác, thì có vẻ như Python rẽ nhánh các đối tượng này. Điều đó có đúng không?Tôi đã thử sử dụng đa xử lý. Giá trị. Nhưng tôi không chắc loại nên là gì? . Nhưng khi tôi thử
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
4, nó không thành công vớifrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
5Có ai biết cái gì đang xảy ra không?
Giải pháp tốt nhất
Sau khi nghiên cứu và thử nghiệm rất nhiều, tôi thấy "Người quản lý" thực hiện công việc này ở cấp độ đối tượng không phức tạp
Đoạn mã dưới đây cho thấy đối tượng
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
6 được chia sẻ giữa các tiến trình, có nghĩa là thuộc tính from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
7 của from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
6 được thay đổi bên ngoài khi tiến trình con thay đổi nófrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class SimpleClass[object]:
def __init__[self]:
self.var = 0
def set[self, value]:
self.var = value
def get[self]:
return self.var
def change_obj_value[obj]:
obj.set[100]
if __name__ == '__main__':
BaseManager.register['SimpleClass', SimpleClass]
manager = BaseManager[]
manager.start[]
inst = manager.SimpleClass[]
p = Process[target=change_obj_value, args=[inst]]
p.start[]
p.join[]
print inst #
print inst.get[] # 100
Được rồi, mã trên là đủ nếu bạn chỉ cần chia sẻ các đối tượng đơn giản
Tại sao không phức tạp?
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
Tôi nghĩ lý do chính của hành vi này là vì
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
9 chỉ là một thanh kẹo được xây dựng dựa trên các công cụ giao tiếp cấp thấp như đường ống/hàng đợiVì vậy, phương pháp này không được khuyến nghị tốt cho trường hợp đa xử lý. Sẽ luôn tốt hơn nếu bạn có thể sử dụng các công cụ cấp thấp như lock/semaphore/pipe/queue hoặc các công cụ cấp cao như Redis queue hoặc Redis publish/subscribe cho trường hợp sử dụng phức tạp [chỉ đề xuất của tôi lol]
Giải pháp liên quan
Python - Sự khác biệt giữa staticmethod và classmethod
Có lẽ một chút mã ví dụ sẽ giúp. Lưu ý sự khác biệt trong chữ ký cuộc gọi của
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
20, from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
21 và from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
22from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
2Dưới đây là cách thông thường mà một đối tượng gọi một phương thức. Thể hiện của đối tượng,
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
23, được truyền hoàn toàn dưới dạng đối số đầu tiênfrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
7Với các phương thức lớp, lớp của thể hiện đối tượng được chuyển hoàn toàn làm đối số đầu tiên thay vì
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
24from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
9Bạn cũng có thể gọi
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
21 bằng cách sử dụng lớp. Thực tế, nếu bạn định nghĩa một cái gì đó là một phương thức lớp, thì có thể là do bạn định gọi nó từ lớp chứ không phải từ một thể hiện của lớp. from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
26 sẽ gây ra TypeError, nhưng from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
27 vẫn hoạt động tốtfrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
3Một cách sử dụng mà mọi người đã tìm thấy cho các phương thức lớp là tạo các hàm tạo thay thế có thể kế thừa
Với các phương thức tĩnh, cả
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
24 [thể hiện đối tượng] và from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
29 [lớp] đều không được chuyển hoàn toàn làm đối số đầu tiên. Chúng hoạt động giống như các hàm đơn giản ngoại trừ việc bạn có thể gọi chúng từ một thể hiện hoặc lớpfrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
6Các phương thức tĩnh được sử dụng để nhóm các hàm có một số kết nối logic với một lớp với lớp
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
20 chỉ là một hàm, nhưng khi bạn gọi from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
71, bạn không chỉ nhận được hàm, mà bạn còn nhận được phiên bản "được áp dụng một phần" của hàm với thể hiện đối tượng from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
23 được liên kết làm đối số đầu tiên cho hàm. from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
20 mong đợi 2 đối số, trong khi from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
71 chỉ mong đợi 1 đối sốfrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
23 bị ràng buộc với from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
20. Đó là ý nghĩa của thuật ngữ "ràng buộc" dưới đâyfrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
4Với
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
77, from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
23 không bị ràng buộc với from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
21, thay vào đó, lớp from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
90 bị ràng buộc với from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
21from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
0Ở đây, với một phương thức tĩnh, mặc dù nó là một phương thức, nhưng
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
92 chỉ trả về một hàm ole tốt mà không có đối số nào bị ràng buộc. from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
22 mong đợi 1 đối số và from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
92 cũng mong đợi 1 đối sốfrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
4Và tất nhiên, điều tương tự cũng xảy ra khi bạn gọi
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
22 với lớp from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
90 thay vìfrom multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
class GetSetter[object]:
def __init__[self]:
self.var = None
def set[self, value]:
self.var = value
def get[self]:
return self.var
class ChildClass[GetSetter]:
pass
class ParentClass[GetSetter]:
def __init__[self]:
self.child = ChildClass[]
GetSetter.__init__[self]
def getChild[self]:
return self.child
def change_obj_value[obj]:
obj.set[100]
obj.getChild[].set[100]
if __name__ == '__main__':
BaseManager.register['ParentClass', ParentClass]
manager = BaseManager[]
manager.start[]
inst2 = manager.ParentClass[]
p2 = Process[target=change_obj_value, args=[inst2]]
p2.start[]
p2.join[]
print inst2 #
print inst2.getChild[] #
print inst2.get[] # 100
#good!
print inst2.getChild[].get[] # None
#bad! you need to register child class too but there's almost no way to do it
#even if you did register child class, you may get PicklingError :]
0Sự khác biệt giữa một quá trình và một chủ đề
Cả quy trình và luồng đều là các chuỗi thực thi độc lập. Sự khác biệt điển hình là các luồng [của cùng một quy trình] chạy trong một không gian bộ nhớ dùng chung, trong khi các quy trình chạy trong các không gian bộ nhớ riêng biệt
Tôi không chắc bạn có thể đang đề cập đến chủ đề "phần cứng" và "phần mềm" nào. Các luồng là một tính năng của môi trường hoạt động, chứ không phải là một tính năng của CPU [mặc dù CPU thường có các hoạt động giúp cho các luồng hoạt động hiệu quả]
Erlang sử dụng thuật ngữ "quy trình" vì nó không hiển thị mô hình đa chương trình bộ nhớ dùng chung. Gọi chúng là "chủ đề" có nghĩa là chúng có bộ nhớ dùng chung