在python中创建线程

我有一个脚本,我想让一个函数与另一个同时运行。

我看过的示例代码:

import threading


def MyThread (threading.thread):
# doing something........


def MyThread2 (threading.thread):
# doing something........


MyThread().start()
MyThread2().start()

我在这方面遇到了麻烦。我更喜欢使用线程函数而不是类来实现这一点。

这是工作脚本:

from threading import Thread


class myClass():


def help(self):
os.system('./ssh.py')


def nope(self):
a = [1,2,3,4,5,6,67,78]
for i in a:
print i
sleep(1)




if __name__ == "__main__":
Yep = myClass()
thread = Thread(target = Yep.help)
thread2 = Thread(target = Yep.nope)
thread.start()
thread2.start()
thread.join()
print 'Finished'
413220 次浏览

你重写run()方法了吗?如果你重写了__init__,你是否确保调用了基类threading.Thread.__init__()?

在启动两个线程之后,主线程是否继续在子线程上无限地/阻塞/连接工作,以便在子线程完成任务之前主线程的执行不会结束?

最后,是否有任何未处理的异常?

可以在Thread构造函数中使用target参数直接传入一个被调用的函数,而不是run

你不需要使用Thread的子类来实现这个工作——看看我下面发布的简单示例,看看如何做到这一点:

from threading import Thread
from time import sleep


def threaded_function(arg):
for i in range(arg):
print("running")
sleep(1)




if __name__ == "__main__":
thread = Thread(target = threaded_function, args = (10, ))
thread.start()
thread.join()
print("thread finished...exiting")

在这里,我将展示如何使用threading模块创建一个线程,该线程将调用一个普通函数作为其目标。你可以看到我如何在线程构造函数中传递我需要的任何参数。

你的代码有几个问题:

def MyThread ( threading.thread ):
  • 你不能子类化一个函数;只有在课堂上
  • 如果你要使用子类,你需要线程化。Thread,不是threading.thread

如果你真的想只用函数来做这件事,你有两个选择:

线程:

import threading
def MyThread1():
pass
def MyThread2():
pass


t1 = threading.Thread(target=MyThread1, args=[])
t2 = threading.Thread(target=MyThread2, args=[])
t1.start()
t2.start()

线程:

import thread
def MyThread1():
pass
def MyThread2():
pass


thread.start_new_thread(MyThread1, ())
thread.start_new_thread(MyThread2, ())

thread.start_new_thread的Doc

我尝试添加另一个join(),它似乎有效。这是代码

from threading import Thread
from time import sleep


def function01(arg,name):
for i in range(arg):
print(name,'i---->',i,'\n')
print (name,"arg---->",arg,'\n')
sleep(1)


def test01():
thread1 = Thread(target = function01, args = (10,'thread1', ))
thread1.start()
thread2 = Thread(target = function01, args = (10,'thread2', ))
thread2.start()
thread1.join()
thread2.join()
print ("thread finished...exiting")


test01()

Python 3有启动并行任务的功能。这使我们的工作更容易。

线程池进程池

下面让我们来了解一下:

ThreadPoolExecutor例子

import concurrent.futures
import urllib.request


URLS = ['http://www.foxnews.com/',
'http://www.cnn.com/',
'http://europe.wsj.com/',
'http://www.bbc.co.uk/',
'http://some-made-up-domain.com/']


# Retrieve a single page and report the URL and contents
def load_url(url, timeout):
with urllib.request.urlopen(url, timeout=timeout) as conn:
return conn.read()


# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
# Start the load operations and mark each future with its URL
future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
print('%r page is %d bytes' % (url, len(data)))

另一个例子

import concurrent.futures
import math


PRIMES = [
112272535095293,
112582705942171,
112272535095293,
115280095190773,
115797848077099,
1099726899285419]


def is_prime(n):
if n % 2 == 0:
return False


sqrt_n = int(math.floor(math.sqrt(n)))
for i in range(3, sqrt_n + 1, 2):
if n % i == 0:
return False
return True


def main():
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
print('%d is prime: %s' % (number, prime))


if __name__ == '__main__':
main()

使用threading实现多线程进程的简单方法

相同的代码片段

import threading


#function which takes some time to process
def say(i):
time.sleep(1)
print(i)


threads = []
for i in range(10):
    

thread = threading.Thread(target=say, args=(i,))


thread.start()
threads.append(thread)


#wait for all threads to complete before main program exits
for thread in threads:
thread.join()