我想为范围(1100)内的每个元素添加5个线程模块, 看哪个罗素在哪根线里。 我几乎完成了所有的代码,但是如何将参数传递到threading.Thread?
import threading,queue
x=range(1,100)
y=queue.Queue()
for i in x:
y.put(i)
def myadd(x):
print(x+5)
for i in range(5):
print(threading.Thread.getName())
threading.Thread(target=myadd,args=x).start() #it is wrong here
y.join()
对达诺说,现在可以了,为了以交互方式运行,我将其重写为:
方法一:交互式运行。
from concurrent.futures import ThreadPoolExecutor
import threading
x = range(1, 100)
def myadd(x):
print("Current thread: {}. Result: {}.".format(threading.current_thread(), x+5))
def run():
t = ThreadPoolExecutor(max_workers=5)
t.map(myadd, x)
t.shutdown()
run()
方法2:
from concurrent.futures import ThreadPoolExecutor
import threading
x = range(1, 100)
def myadd(x):
print("Current thread: {}. Result: {}.".format(threading.current_thread(), x+5))
def run():
t = ThreadPoolExecutor(max_workers=5)
t.map(myadd, x)
t.shutdown()
if __name__=="__main__":
run()
如果有更多的参数要传递给ThreadPoolExecutor呢? 我想用多处理模块计算1+3,2+4,3+45到100+102。 那么20+1,20+2,20+3到20+100的多处理模块呢?
from multiprocessing.pool import ThreadPool
do = ThreadPool(5)
def myadd(x,y):
print(x+y)
do.apply(myadd,range(3,102),range(1,100))
怎么解决?
发件人:
致:
看起来您正在尝试手动创建线程池,以便使用五个线程将所有100个结果相加。如果是这种情况,我建议对此使用
multiprocessing.pool.ThreadPool
:如果您使用的是Python 3.x,则可以使用^{} 代替:
我认为你的原始代码有两个问题。首先,需要将元组传递给
args
关键字参数,而不是单个元素:但是,您还试图将由
range(1,100)
返回的整个列表(或者range
对象,如果使用Python 3.x)传递给myadd
,这并不是您真正想要做的。也不清楚您使用队列的目的。也许你是想把这个传给myadd
?最后一个注意事项:Python使用全局解释器锁(GIL),它防止一次有多个线程使用CPU。这意味着在线程中执行CPU绑定的操作(比如加法)不会提高Python的性能,因为一次只能运行一个线程。因此,在Python中,最好使用多个进程来并行化CPU绑定的操作。通过将第一个示例中的
ThreadPool
替换为from mulitprocessing import Pool
,可以使上述代码使用多个进程。在第二个示例中,您将使用ProcessPoolExecutor
,而不是ThreadPoolExecutor
。您可能还想用os.getpid()
替换threading.current_thread()
。编辑:
下面是如何处理要传递两个不同参数的情况:
我们使用
zip
创建一个列表,将范围内的每个变量组合在一起:我们使用
map
对该列表中的每个元组调用do_myadd
,并且do_myadd
使用元组扩展(*x_and_y
),将元组扩展为两个单独的参数,这些参数将传递给myadd
。这里需要传递元组,而不是使用单个元素。
做元组的代码应该是。
请参考here了解更多说明
相关问题 更多 >
编程相关推荐