python - 在python中启动多个线程

标签 python multithreading

我希望同时执行下面代码中的 saveData 函数。但是,在第一次运行 saveData 之后,我得到了错误:

Traceback (most recent call last):
  File "preProcess.py", line 70, in <module>
    run()        
  File "preProcess.py", line 61, in run
    thread.start_new_thread(saveData(slice1, slice2, slice3, dset), ("Thread-" + str(i), 1, ) )
TypeError: first arg must be callable

我的代码是

#!/usr/bin/env python
import sys

import numpy as np
import h5py
import scipy
from PIL import Image
import timeit
import thread

import matplotlib.pyplot as plt

def saveImage(array, filename):
  fig=plt.figure(figsize=(4,3))
  ax=fig.add_subplot(1,1,1)
  plt.axis('off')
  p = plt.imshow(array)
  p.set_cmap('gray')
  extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
  plt.savefig(filename, bbox_inches=extent) 

def saveData(value1, value2, value3, dset):
  filename = "tomo1_" + str(value1) + ".png" 
  data = dset[value1::]
  saveImage(data, filename)
  filename = "tomo2_" + str(value2) + ".png" 
  data = dset[:value2:]
  saveImage(data, filename)
  filename = "tomo3_" + str(value3) + ".png" 
  data = dset[::value3]
  saveImage(data, filename)

def run():

  # Reopen the file and dataset using default properties.
  f = h5py.File(sys.argv[1])
  dset = f[sys.argv[2]]

  dim1 = len(dset)
  dim2 = len(dset[0])
  dim3 = len(dset[0][0])

  slice1 = 0
  slice2 = 0
  slice3 = 0
  factor1 = dim1/48
  factor2 = dim2/48
  factor3 = dim3/48
  tic=timeit.default_timer()
  for i in range(0,48):
    thread.start_new_thread(saveData(slice1, slice2, slice3, dset), ("Thread-" + str(i),     1, ) )
    slice1 = slice1 + factor1
    slice2 = slice2 + factor2
    slice3 = slice3 + factor3

  toc=timeit.default_timer()
  print "elapsed time: " + str(toc - tic)

if __name__ == "__main__":
    run()        

我想同时执行 saveData 函数 48 次。 我做错了什么?

最佳答案

正如 Gryphius 所指出的:您绝不能start_new_thread 中执行saveData,而是将您的函数用作 的普通参数thread.start_new_thread!

原因是,thread.start_new_thread 将在线程中为您执行该功能。所以你不仅要传递函数作为参数(不执行它),还要传递函数的参数:

thread.start_new_thread(saveData,(slice1,slice2,slice3,dset),("Thread-"+str(i),1,))

如您所见,函数的参数作为元组传递。

作为旁注: 这种习惯用法,即不调用函数,而是将其与参数一起传递,也出现在事件处理函数中:回调。

还可以考虑使用 Threading 包而不是 thread,它更复杂并且允许您有更多的自由和功能!

关于python - 在python中启动多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20519082/

相关文章:

python - python中的子串比较

Java 线程安全计数器

python - 用同一字符串中的单个单词替换字符串的一部分

python - 如何根据 Pandas 数据框中的列表重新排序索引行

c# - 如何在c#中等待事件被处理

Java多线程: How to make a thread wait ?

multithreading - 多线程make

c++ - 如何在 Windows 上取消等待 select()

python - 自定义损失函数结果与内置损失函数结果不匹配

python - python模块导入中的继承与类实例