Python - 将线程变成多处理
Python - Turn Thread into Multiprocessing
所以在过去的那些日子里,我一直在努力弄清楚如何开始使用线程,我终于让它开始工作了!我现在遇到的问题是我希望他们同时 运行。我听说有不同的说法,例如 GIL 不起作用。有人说它适用于 multiprocessing
等。但是我转过这里看看是否可行,怎么说呢?
基本上我的代码现在看起来像这样:
带Thread的代码
def start(config):
NameUrl = config["Url"]
myNote = config["My-Note"]
checkoutNames(Nameurl, MyNote)
if __name__ == '__main__':
with open('config.json', 'r', encoding='UTF-8') as json_data:
config = json.load(json_data)
threads = []
for i, e in enumerate(config):
threads.append(threading.Thread(target=start, args=(config[i] or e)))
如您在 if __name__ == '__main__':
中所见,这就是线程所在的位置。然而,此时它所做的是它首先执行线程 1,当它完成后它转向线程 2 并继续这样,我希望将它变成 concurrently/simultaneously 如果可能的话?
编辑
代码
if __name__ == '__main__':
with open('config.json', 'r', encoding='UTF-8') as json_data:
config = json.load(json_data)
jobs = []
for i, e in enumerate(config):
c = (config[i] or e)
p = multiprocessing.Process(target=start, args=(c))
jobs.append(p)
p.start()
上面代码出现的错误:
[<Process(Process-1, initial)>]
<Process(Process-1, initial)>
{'Email': '123o@gmail.com', 'PersonNumber': '4234', 'ZipCode': '1241234', 'Name': 'Guess', 'LastName': 'TheyKnow'}
[<Process(Process-1, started)>, <Process(Process-2, initial)>]
<Process(Process-2, initial)>
{'Email': 'Hello@hotmail.com', 'PersonNumber': '1234', 'ZipCode': '56431', 'Name': 'Stack', 'LastName': 'Overflow'}
Process Process-1:
Traceback (most recent call last):
File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap
self.run()
File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
TypeError: start() takes 1 positional argument but 16 were given
Process Process-2:
Traceback (most recent call last):
File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap
self.run()
File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
TypeError: start() takes 1 positional argument but 16 were given
我认为您需要修复 args 参数:
...
jobs = []
for i, e in enumerate(config):
c = (config[i] or e)
p = multiprocessing.Process(target=start, args=(c,))
jobs.append(p)
p.start()
注意 args
参数中使用的语法:
args=(c,)) # <=== (c,) means that we are assigning the tuple (c,) to args
# which gets translated into start(c)
所以在过去的那些日子里,我一直在努力弄清楚如何开始使用线程,我终于让它开始工作了!我现在遇到的问题是我希望他们同时 运行。我听说有不同的说法,例如 GIL 不起作用。有人说它适用于 multiprocessing
等。但是我转过这里看看是否可行,怎么说呢?
基本上我的代码现在看起来像这样:
带Thread的代码
def start(config):
NameUrl = config["Url"]
myNote = config["My-Note"]
checkoutNames(Nameurl, MyNote)
if __name__ == '__main__':
with open('config.json', 'r', encoding='UTF-8') as json_data:
config = json.load(json_data)
threads = []
for i, e in enumerate(config):
threads.append(threading.Thread(target=start, args=(config[i] or e)))
如您在 if __name__ == '__main__':
中所见,这就是线程所在的位置。然而,此时它所做的是它首先执行线程 1,当它完成后它转向线程 2 并继续这样,我希望将它变成 concurrently/simultaneously 如果可能的话?
编辑
代码
if __name__ == '__main__':
with open('config.json', 'r', encoding='UTF-8') as json_data:
config = json.load(json_data)
jobs = []
for i, e in enumerate(config):
c = (config[i] or e)
p = multiprocessing.Process(target=start, args=(c))
jobs.append(p)
p.start()
上面代码出现的错误:
[<Process(Process-1, initial)>]
<Process(Process-1, initial)>
{'Email': '123o@gmail.com', 'PersonNumber': '4234', 'ZipCode': '1241234', 'Name': 'Guess', 'LastName': 'TheyKnow'}
[<Process(Process-1, started)>, <Process(Process-2, initial)>]
<Process(Process-2, initial)>
{'Email': 'Hello@hotmail.com', 'PersonNumber': '1234', 'ZipCode': '56431', 'Name': 'Stack', 'LastName': 'Overflow'}
Process Process-1:
Traceback (most recent call last):
File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap
self.run()
File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
TypeError: start() takes 1 positional argument but 16 were given
Process Process-2:
Traceback (most recent call last):
File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap
self.run()
File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
TypeError: start() takes 1 positional argument but 16 were given
我认为您需要修复 args 参数:
...
jobs = []
for i, e in enumerate(config):
c = (config[i] or e)
p = multiprocessing.Process(target=start, args=(c,))
jobs.append(p)
p.start()
注意 args
参数中使用的语法:
args=(c,)) # <=== (c,) means that we are assigning the tuple (c,) to args
# which gets translated into start(c)