我想要做的是這樣的:如何使用concurrent.futures.ThreadPoolExecutor或multiprocessing.pool.ThreadPool將某些變量綁定到線程?
class MyThread(threading.Thread):
def __init__(self, host, port):
threading.Thread.__init__(self)
# self._sock = self.initsocket(host, port)
self._id = random.randint(0, 100)
def run(self):
for i in range(3):
print("current id: {}".format(self._id))
def main():
ts = []
for i in range(5):
t = MyThread("localhost", 3001)
t.start()
ts.append(t)
for t in ts:
t.join()
我這些輸出:
current id: 10
current id: 10
current id: 13
current id: 43
current id: 13
current id: 10
current id: 83
current id: 83
current id: 83
current id: 13
current id: 98
current id: 43
current id: 98
current id: 43
current id: 98
該輸出我想要的。正如你所看到的,我的_id
在不同的線程中是不同的,但是在單線程中,我共享相同的_id
(_id
只是其中的一個變量,我有很多其他類似的變量)。
現在,我想做同樣的事情multiprocessing.pool.ThreadPool
class MyProcessor():
def __init__(self, host, port):
# self._sock = self.initsocket(host, port)
self._id = random.randint(0, 100)
def __call__(self, i):
print("current id: {}".format(self._id))
return self._id * i
def main():
with ThreadPool(5) as p:
p.map(MyProcessor("localhost", 3001), range(15))
但現在_id
將被所有線程共享:
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
current id: 58
而且隨着concurrent.futures.ThreadPoolExecutor
,我也嘗試着做同樣的東西:
class MyProcessor():
def __init__(self, host, port):
# self.initsocket(host, port)
self._id = random.randint(0, 100)
def __call__(self, i):
print("current id: {}".format(self._id))
return self._id * i
def main():
with ThreadPoolExecutor(max_workers=5) as executor:
func = MyProcessor("localhost", 3001)
futures = [executor.submit(func, i) for i in range(15)]
for f in as_completed(futures):
pass
產量是這樣的:
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
current id: 94
當然,我得到這樣的結果並不陌生,因爲我只是叫__init__
一次。但我所要求的是:
我該怎麼做concurrent.futures.ThreadPoolExecutor
和multiprocessing.pool.ThreadPool
(也請不要再有全局變量)。
在__init__中設置的任何內容都是共享的。在'__call__'中設置的任何東西都是線程本地的。在'__init__'中設置端口和其他共享的東西。在'__call__'中設置ID。和我對你的其他問題的回答一樣。 –
你只需看看呼叫屬於哪個線程並根據該線索進行調整。 '__init__'是主線程。 '__call__'由單個任務線程運行。 –
我會在這裏起草答案並更新另一個,現在我明白了一旦我今晚到達計算機後會出現什麼困惑。 –