将你需要多线程并发执行的函数放入list中
创新互联专业为企业提供永安网站建设、永安做网站、永安网站设计、永安网站制作等企业网站建设、网页设计与制作、永安企业网站模板建站服务,10年永安做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
import threading
threads = []
t1 = threading.Thread(target=函数名,args=参数)
threads.append(t1)
启动多线程
if __name__ == '__main__':
for t in threads:
t.setDaemon(True)
t.start()
t.join()
更多详细操作help(threading)
#coding=utf-8
import threading
from time import ctime,sleep
# 要启动的函数
def music(func):
for i in range(2):
print "I was listening to %s. %s" %(func,ctime())
sleep(1)
# 要启动的函数
def move(func):
for i in range(2):
print "I was at the %s! %s" %(func,ctime())
sleep(5)
threads = []
t1 = threading.Thread(target=music,args=(u'爱情买卖',))
threads.append(t1)
t2 = threading.Thread(target=move,args=(u'阿凡达',))
threads.append(t2)
# 函数加入线程列表
if __name__ == '__main__':
for t in threads:
t.setDaemon(True)
t.start()
t.join() #子线程完成运行之前,这个子线程的父线程将一直被阻塞,不会退出
print "all over %s" %ctime()
# -*- coding: utf-8 -*-
import threading
import thread
import time
class Test(object):
def __init__(self):
# threading.Thread.__init__(self)
self._sName = "machao"
def process(self):
#args是关键字参数,需要加上名字,写成args=(self,)
th1 = threading.Thread(target=Test.buildList, args=(self,))
th1.start()
th1.join()
def buildList(self):
while True:
print "start"
time.sleep(3)
test = Test()
test.process()
使用线程池:threadpool 模块。这是一个第三方模块,可以通过下面方法安装:
easy_install threadpool
以前在远标时也遇见过的确有多线程调用的冲突问题。 通常是初始化一个python解释器。作为全局变量。然后每个线程分别调用。
因为python解释器里有一个GIL的全局锁。所以要防止线程间因为GIL造成的死锁。
不过具体的使用方法,与单线程没有区别。初始化python解释器。然后加载脚本,运行,取得返回变量就可以了。
如果你使用system,就当我没有说。 即使是使用system,也会有多线程的冲突可能性。因为操作系统的管道管理,相关文件,相关数据库,临时文件等都可能会产生冲突。
如果是同一包里面,直接就可以使用,如果不是同一个包,那么需要先import后,通过“包名.类名”才能使用。 下面是同一个包里面的案例: def a(): print(1) def b(): a() print (2) b()
1.python中数据类型,int,float,复数,字符,元组,做全局变量时需要在函数里面用global申明变量,才能对变量进行操作。
而,对象,列表,词典,不需要声明,直接就是全局的。
2.线程锁mutex=threading.Lock()
创建后就是全局的。线程调用函数可以直接在函数中使用。
mutex.acquire()开启锁
mutex=release()关闭锁
要注意,死锁的情况发生。
注意运行效率的变化:
正常1秒,完成56997921
加锁之后,1秒只运行了531187,相差10倍多。
3.继承.threading.Thread的类,无法调用__init__函数,无法在创建对象时初始化新建的属性。
4.线程在cpu的执行,有随机性
5. 新建线程时,需要传参数时,args是一个元组,如果只有一个参数,一定后面要加一个,符号。不能只有一个参数否则线程会报创建参数错误。threading.Thread(target=fuc,args=(arg,))